go - 动态函数返回类型
问题描述
我有一个按模块分隔的应用程序。有几个实体和 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
}
解决方案
Quick/Dirty 解决方案:返回 interface{},但你最终会欺骗编译器,而进行类型检查的痛苦就在你身上。
更好/更安全的解决方案:考虑您需要对返回的类型执行的常见操作,为每种类型定义这些常用方法,并将这些常用方法保留在接口中。如果你试图从一个函数中返回多个类型,很可能它们之间已经存在一些共同的关系,或者只需很少的重组就可以找到。从函数返回该接口。这样,编译器将始终能够检查您没有返回意外的东西(没有实现这些方法的东西)。您可能想查看该factory method
模式在 Golang 中是如何实现的。(提示:它返回接口,而不是通常在 C++/Java 中完成的超类)
推荐阅读
- python - 使用 elif 打印用户是否访问过超过 2 个大洲但少于 6 个
- react-native - 更改为新路线时更改圆圈的动画大小
- c# - 单元测试 - 进程没有包 ID
- javascript - JSON正文上的正则表达式 - 兄弟
- javascript - 有人可以解释一下这段代码的第二部分吗?
- python - Python:保持和检查两个徽标是否相同与其方向无关的最佳方法
- java - 如何在多播()中的骆驼路由中持久化标头或属性?
- user-controls - 将用户限制在 bitbucket 中的单个工作区
- javascript - 如何在 Javascript 中转置对象数组?
- javascript - 使用 ScrollToTop 和 HashRouter 修复 404。有小费吗?