为了账号安全,请及时绑定邮箱和手机立即绑定

接口类型的函数返回(另一个)接口类型的结构

接口类型的函数返回(另一个)接口类型的结构

Go
Qyouu 2022-01-04 21:24:19
我试图在两个存储之间建立一个中间层,从存储 A 获取,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,因此我希望使用 amap[string]func并基于storageA.Type确定我需要调用的转换函数。这些转换函数中的每一个都将返回不同的结构,所有这些都反映了存储 B 中的不同类型。这些存储 B 结构中的每一个都实现了一个公共接口,因此它们可以调用函数。归结为我的问题是,即使实现了 interface ,我也无法强制func(StorageAType) StorageBType1转换。func(StorageAType) StorageBTypeStorageBtype1StorageBType我创建了这个相当长的游乐场,因为我意识到用语言描述问题很棘手。注释掉第 38-41 和 60-63 行将使其运行,但这是我想要使用的那些行。抱歉它的大小,但我想不出一个不那么冗长但清晰的例子。请注意,我必须重新创建我的 stackoverflow 帐户,所以我认为我没有代表对答案发表评论。*编辑:很典型。在询问之后我才意识到如何解决它。通过在转换器函数中返回接口类型而不是确切的类型,在这个操场上发生了变化。
查看完整描述

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!")

}


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信