1 回答
TA贡献1818条经验 获得超8个赞
具有不同结果类型的函数类型是不同的类型,结果类型中的一种是否实现了另一种并不重要。规格: 功能类型:
函数类型表示具有相同参数和结果类型的所有函数的集合。
StorageBtype1和StorageBType是不同的类型,因此以它们作为结果类型的函数类型也不同,并且这些函数类型之一的值不能用作另一个的值。
只需将所有转换器函数的结果类型更改为StorageBType:
func TypeA3ToTypeB1(i StorageAType) StorageBType {
return StorageBType1{i.Type}
}
func TypeA5ToTypeB2(i StorageAType) StorageBType {
return StorageBType2{i.Type, i.Name}
}
由于所有返回值都实现了StorageBType,因此这是一个有效的更改,不需要对转换器函数的实现进行更改。
现在当然调用这些函数将返回一个类型的值StorageBType。如果这对您来说已经足够/足够了,那么您无需再做任何事情。
如果您需要将返回值作为存储在接口值中的具体类型,您可以使用类型断言。
例如:
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
如果要测试许多具体类型,可以使用类型开关:
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 关注
- 168 浏览
添加回答
举报