具有多种返回类型的接口方法

时间:2017-07-12 11:06:46

标签: object go interface

我来自java,目前正在尝试学习go。我正忙着interface

考虑一下:

type Generatorer interface {
    getValue() // which type should I put here ? 
}

type StringGenerator struct {
    length         int
}

type IntGenerator struct {
    min            int
    max            int
}

func (g StringGenerator) getValue() string {
    return "randomString"
}

func (g IntGenerator) getValue() int {
    return 1
}

我希望getValue()函数返回 string int ,具体取决于是否从{{{ 1}}或StringGenerator

当我尝试编译时,我得到了以下错误:

  

不能在数组或类型中使用s(type * StringGenerator)作为Generatorer类型   切片文字:     * StringGenerator不实现Generatorer(getValue方法的类型错误)

     

有getValue()字符串
    想要getValue()

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

可以以这种方式实现它:

type Generatorer interface {
    getValue() interface{}
}

type StringGenerator struct {
    length         int
}

type IntGenerator struct {
    min            int
    max            int
}

func (g StringGenerator) getValue() interface{} {
    return "randomString"
}

func (g IntGenerator) getValue() interface{} {
    return 1
}

空接口允许每个值。这允许使用通用代码,但基本上阻止您使用非常强大的Go类型系统。

在您的示例中,如果您使用getValue函数,您将获得类型interface{}的变量,如果您想使用它,您需要知道它实际上是字符串还是int:你需要很多reflect才能使你的代码变慢。

来自Python我习惯于编写非常通用的代码。学习Go时,我不得不停止这样思考。

这意味着在您的具体情况下我无法说出,因为我不知道StringGeneratorIntGenerator正在被用于什么。

答案 1 :(得分:0)

您无法按照自己的方式实现目标。但是,您可以将该函数声明为

type Generatorer interface {
    getValue() interface{}
}

如果您希望它在不同的实现中返回不同的类型。