首页 > 解决方案 > 动态函数返回类型

问题描述

我有一个按模块分隔的应用程序。有几个实体和 CSV 模块。CSV 模块仅支持结构(实体),但我想让 CSV 模块适用于任何类型的实体。现在它的工作方式是这样的:csv 模块从通道接收数据并严格将其转换为EverySize结构。如何实现动态返回类型,因此它适用于任何类型的实体,不仅适用于Everysize

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

标签: gostructinterfacefunctional-programming

解决方案


Quick/Dirty 解决方案:返回 interface{},但你最终会欺骗编译器,而进行类型检查的痛苦就在你身上。

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


推荐阅读