首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口类型函数返回(另一)接口类型的结构

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

Stack Overflow用户
提问于 2016-04-22 08:13:45
回答 1查看 111关注 0票数 4

我试图在两个存储之间建立一个中间层,从存储A获取,将其转换为相应类型的存储B,然后存储它。由于需要转换的类型大约有50-100个,所以我希望使用map[string]func,并根据storageA.Type确定需要调用哪个转换函数。

这些转换函数中的每一个都将返回不同的结构,它们都反映了存储B中的不同类型。每个存储B结构都实现了一个公共接口,因此可以用它们来调用函数。

简单地说,我的问题是我不能将func(StorageAType) StorageBType1转换为func(StorageAType) StorageBType,即使StorageBtype1实现了接口StorageBType

我已经创建了这个相当长的游乐场,因为我意识到用语言描述这个问题是很棘手的。注释掉第38-41行和第60-63行将使其运行,但这是我想要使用的行。对不起,它的大小,但我想不出一个不那么冗长,但明确的例子。

请注意,我必须重新创建我的堆栈溢出帐户,所以我认为我没有代表评论答案。

*编辑:

非常典型。刚问完我就意识到该怎么解决了。通过返回转换器函数中的接口类型,而不是确切的类型,在此游乐场中进行了更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 08:26:38

不同结果类型的函数类型是不同的类型,其中一个结果类型实现另一个结果类型并不重要。规范:功能类型:

函数类型表示具有、相同参数和结果类型的所有函数集。

StorageBtype1StorageBType是不同的类型,因此将它们作为结果类型的函数类型也不同,其中一个函数类型的值不能用作另一个函数类型的值。

只需将所有转换器函数的结果类型更改为StorageBType

代码语言:javascript
复制
func TypeA3ToTypeB1(i StorageAType) StorageBType {
    return StorageBType1{i.Type}
}

func TypeA5ToTypeB2(i StorageAType) StorageBType {
    return StorageBType2{i.Type, i.Name}
}

因为所有返回值都实现了StorageBType,所以这是一个有效的更改,并且不需要对转换器函数的实现进行更改。

当然,现在调用这些函数将返回一个类型为StorageBType的值。如果这对你来说足够/足够的话,你就没有什么可做的了。

如果您可能需要返回值作为存储在接口值中的具体类型,则可以使用类型断言

例如:

代码语言:javascript
复制
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
}

输出:

代码语言:javascript
复制
b1.Type: 3

如果要测试多个具体类型,可以使用类型开关

代码语言:javascript
复制
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!")
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36788465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档