我有以下界面:
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。如果我只使用返回类型,那么它将破坏我的界面,对吗?
我认为这是一个常见问题,并且我在界面上缺少一些关键知识组件,感谢所有帮助。
请注意:我宁愿不返回接口,我真的很想返回一段类型化的数据。
答案 0 :(得分:0)
我如何根据接收者使用具有不同返回类型的方法?
TL; DR; 您不能。
更长的答案:大约有三个选项可以完成您所描述的内容。您可能不喜欢其中任何一个。
返回界面
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)
第四个选择,可能是您的特定情况下最好的选择,是重构,因此上述任何一项都不是必需的。但是,如果不了解您的大问题,我无法就您的情况提出具体,具体的建议。