go - 动态函数返回类型

标签 go struct interface functional-programming

我有一个按模块分开的应用程序。有几个实体和 CSV 模块。 Csv 模块仅支持结构(实体),但我想让 CSV 模块适用于任何类型的实体。现在它是这样工作的: Csv 模块从 channel 接收数据并将其严格转换为 EverySize 结构。我怎样才能实现动态返回类型,以便它适用于任何类型的实体,而不仅仅是 Everysize

    func prepareWrapData(data []feed.WrapExporterChannels) []everysize.EverySizeItem {
        var result []everysize.EverySizeItem
        for _, value := range data {
            result = append(result, *value.EverySizeItem)
        }
    return result
}

最佳答案

Quick/Dirty 解决方案:返回接口(interface){},但最终你欺骗了编译器,而类型检查的痛苦由你承担。

更好/更安全的解决方案:考虑您需要对返回的类型执行的常见操作,为每种类型定义这些通用方法,并将这些通用方法保存在一个接口(interface)中。如果您试图从一个函数返回多个类型,很可能它们之间一定已经存在一些共同的关系,或者可以通过很少的重组找到。从函数返回该接口(interface)。这样,编译器将始终能够检查您是否没有返回意外的东西(没有实现这些方法的东西)。 您可能想查看 工厂方法 模式是如何在 Golang 中实现的。 (提示:它返回接口(interface),而不是像通常在 C++/Java 中那样返回父类(super class))

关于go - 动态函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52514540/

相关文章:

php - Go - 如何从字符串设置 RSA 公钥模数?

go - 使用重复的 JSON 映射将 JSON 反序列化为结构

c# - 如何使用每个实现的附加参数/信息实现接口(interface)

Golang 上下文。上下文传播

c++ - 使用 ctypes 的回调函数

c - 错误 : field has incomplete type in C

c++ - 使用 char* 构建动态结构的更好方法?

java - 停留在如何将项目添加到库存列表java上

C++:什么是类接口(interface)?

go - 调用方法属于struct的字段