我试图查看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/,在文章底部附近有一个类似的例子,但它确实使用了中间接口。
答案 0 :(得分:6)
使用函数所需的方法声明接口:
type SinAdder interface {
Sin(float64) float64
Add(float64, float64) float64
}
如果您声明了单个方法接口Siner
和Adder
,则可以根据这些接口声明SinAdder
:
type SinAdder interface {
Siner
Adder
}
在函数中使用该接口:
func example(arg SinAdder) {
}
任何具有Sin和Add方法的值都可以传递给示例。
您可以通过在函数参数中使用匿名接口定义来无效声明SinAdder接口:
func example(arg interface { Siner; Adder }) {
}