1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
具有不同結(jié)果類型的函數(shù)類型是不同的類型,結(jié)果類型中的一種是否實(shí)現(xiàn)了另一種并不重要。規(guī)格: 功能類型:
函數(shù)類型表示具有相同參數(shù)和結(jié)果類型的所有函數(shù)的集合。
StorageBtype1和StorageBType是不同的類型,因此以它們作為結(jié)果類型的函數(shù)類型也不同,并且這些函數(shù)類型之一的值不能用作另一個(gè)的值。
只需將所有轉(zhuǎn)換器函數(shù)的結(jié)果類型更改為StorageBType:
func TypeA3ToTypeB1(i StorageAType) StorageBType {
return StorageBType1{i.Type}
}
func TypeA5ToTypeB2(i StorageAType) StorageBType {
return StorageBType2{i.Type, i.Name}
}
由于所有返回值都實(shí)現(xiàn)了StorageBType,因此這是一個(gè)有效的更改,不需要對轉(zhuǎn)換器函數(shù)的實(shí)現(xiàn)進(jìn)行更改。
現(xiàn)在當(dāng)然調(diào)用這些函數(shù)將返回一個(gè)類型的值StorageBType。如果這對您來說已經(jīng)足夠/足夠了,那么您無需再做任何事情。
如果您需要將返回值作為存儲在接口值中的具體類型,您可以使用類型斷言。
例如:
a := StorageAType{Type:3}
b := TypeA3ToTypeB1(a) // b is of type StorageBType
if b1, ok := b.(StorageBType1); ok {
// b1 is of type StorageBType1, you may use it like so:
fmt.Println("b1.Type:", b1.Type)
} else {
// b is not of type StorageBType1, or it is nil
}
輸出:
b1.Type: 3
如果要測試許多具體類型,可以使用類型開關(guān):
switch i := b.(type) {
case nil:
fmt.Println("nil")
case StorageBType1:
// Here i is of type StorageBType1, you may refer to its fields:
fmt.Println("StorageBType1", i.Type)
case StorageBType2:
// Here i is of type StorageBType2, you may refer to its fields:
fmt.Println("StorageBType2", i.Type, i.Name)
default:
fmt.Println("Unhandled type!")
}
- 1 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)