首页 > 解决方案 > 根据接收者,我如何拥有具有不同返回类型的方法?

问题描述

我有以下界面:

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。如果我只是添加一个返回类型,那么它会破坏我的界面,对吗?

我认为这是一个常见问题,并且我缺少一些关于接口的关键知识组件,感谢所有帮助。

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

标签: go

解决方案


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

TL;博士; 你不能。

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

  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)
    

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


推荐阅读