Go语言能否避免使用中间接口?

3
我正在尝试查看Go是否支持我在其他面向对象语言(例如Java)中使用的语言特性。我想定义一些接口,并将支持其中一些接口的对象作为参数传递给函数。
在Java中,我可能会定义一堆单方法接口,例如HasAdd、HadMul、HasSub、HasDiv、HasSin、HasCos、HasTan等等。
然后我可能会定义一个通用方法,其参数T被定义为<T extends HasSin & HasAdd>。我将T传递给该方法。请注意,我不必定义一个包含HasSin和HasAdd的中间接口。(这很棒,因为n个接口需要2^n个中间接口才能覆盖所有情况。)
我知道go不支持泛型。但是它能做类似于func(HasSin & HasAdd obj)这样的事情吗?它似乎应该支持这种行为。只是我还没有找到肯定或否定的文档。
我看过这篇文章:https://golangbot.com/interfaces-part-2/,文章底部有类似的示例,但它确实使用了一个中间接口。
1个回答

6

声明一个接口,其中包含函数所需的方法:

type SinAdder interface {
    Sin(float64) float64
    Add(float64, float64) float64
}

如果你声明了单方法接口SinerAdder,那么你可以通过这些接口声明SinAdder
type SinAdder interface {
    Siner
    Adder
}

在函数中使用该接口:

func example(arg SinAdder) {
}

任何具有Sin和Add方法的值都可以传递到示例中。

您可以使用函数参数中的匿名接口定义来避免声明SinAdder接口:

func example(arg interface { Siner; Adder }) {
}

3
我认为原帖想要避免第一部分。在这个答案中,“SinAdder”是中间接口。然而最后一部分可能是正确的答案。 - atakanyenel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接