Go可以避免使用中间接口吗?

时间:2019-05-04 22:24:01

标签: go

我试图查看Go是否支持我在其他OO语言(例如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 个答案:

答案 0 :(得分: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 }) {
}