go - 根据接收者,我如何拥有具有不同返回类型的方法?
问题描述
我有以下界面:
type ExampleInterface interface{
GetFirstItemInSlice()
}
func GetFirstItemInSlice(slice ExampleInterface){
slice.GetFirstItemInSlice()
}
func (slice IntSlice) GetFirstItemInSlice(){
// Omitted for brevity.
}
func (slice StringSlice) GetFirstItemInSlice(){
// Omitted for brevity.
}
现在,这里很清楚,我的两个具有接收器(底部两个)的函数将希望返回不同的类型,一个是字符串,另一个是 int。如果我只是添加一个返回类型,那么它会破坏我的界面,对吗?
我认为这是一个常见问题,并且我缺少一些关于接口的关键知识组件,感谢所有帮助。
请注意:我宁愿不返回接口,我真的很想返回一段输入的数据。
解决方案
根据接收者,我如何拥有具有不同返回类型的方法?
TL;博士; 你不能。
更长的答案:大约有三个选项可以完成您所描述的内容。你可能不会喜欢其中任何一个。
返回一个接口
type ExampleInterface interface{ GetFirstItemInSlice() interface{} }
然后,当然,由每个调用者来断言返回到底层类型。
使用不同的返回类型。
type IntInterface interface{ GetFirstIntInSlice() int } type StringInterface interface { GetFirstStringSlice() string }
不要返回,而是使用反射来修改传入的变量。
type ExampleInterface interface{ GetFirstItemInSlice(interface{}) }
这是最复杂的写法,而且对于像返回 int 或 slice 这样简单的事情几乎可以肯定是矫枉过正。但它确实可以用于更复杂的数据结构,并且是标准库的json解组之类的方法。在这种情况下,调用者将传递一个指向已分配变量的指针,然后该方法将使用反射设置该变量。调用代码可能如下所示:
var foo int ei.GetFirstItemInSlice(&foo)
第四种选择,可能是您特定情况下最好的选择,是重构,因此上述任何一项都不是必需的。但是,在不了解您的更大问题的情况下,我无法就如何在您的情况下执行此操作提供具体而具体的建议。
推荐阅读
- elastic-stack - 如何在浏览器中访问 ELK 服务?
- java - Java 11 局部变量类型推断改进用法
- javascript - ng-show 不能在 angularjs 上工作 div 仍然隐藏
- javascript - 从另一个人那里解决一个外部承诺——交替执行顺序?
- excel - 使用 VBA 自动填充(导入新导出时扩展公式)
- kotlin - Kotlin - 检查对象是否实现特定接口
- django - 如何过滤一组值的字段
- swift - libsybdb.a(dblib.o)' 不包含位码
- python - 如何使用python确定两个图中的峰值并仅绘制两个图中的峰值图
- node.js - 如何在 docker 容器中配置节点应用程序和 haProxy?