如何根据接收者使用具有不同返回类型的方法?

时间:2018-08-23 04:26:24

标签: 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。如果我只使用返回类型,那么它将破坏我的界面,对吗?

我认为这是一个常见问题,并且我在界面上缺少一些关键知识组件,感谢所有帮助。

请注意:我宁愿不返回接口,我真的很想返回一段类型化的数据。

1 个答案:

答案 0 :(得分:0)

  

我如何根据接收者使用具有不同返回类型的方法?

TL; DR; 您不能。

更长的答案:大约有三个选项可以完成您所描述的内容。您可能不喜欢其中任何一个。

  1. 返回界面

    type ExampleInterface interface{
        GetFirstItemInSlice() interface{}
    }
    

    然后,当然,这取决于每个调用者来断言为基础类型。

  2. 使用不同的返回类型。

    type IntInterface interface{
        GetFirstIntInSlice() int
    }
    
    type StringInterface interface {
        GetFirstStringSlice() string
    }
    
  3. 不返回,而是使用反射来修改传入的变量。

    type ExampleInterface interface{
        GetFirstItemInSlice(interface{})
    }
    

    这是要编写的最复杂的代码,几乎可以肯定,对于返回int或slice这样的简单操作来说,它是过分杀伤力的。但是它确实可用于更复杂的数据结构,并且是标准库的json解组之类的方法所采用的方法。在这种情况下,调用方将传入指向已分配变量的指针,然后该方法将使用反射将其设置。调用代码可能类似于:

    var foo int
    ei.GetFirstItemInSlice(&foo)
    

第四个选择,可能是您的特定情况下最好的选择,是重构,因此上述任何一项都不是必需的。但是,如果不了解您的大问题,我无法就您的情况提出具体,具体的建议。