我正在尝试查看 Go 是否支持我在其他 OO 语言(例如 Java)中使用的语言功能。我想定义一些接口(interface)并将支持其中一些接口(interface)的对象作为参数传递给函数。
在 Java 中,我可能会定义一堆单一方法接口(interface),如 HasAdd、HadMul、HasSub、HasDiv、HasSin、HasCos、HasTan 等。
然后我可能会定义一个通用方法,其参数 T 定义为 <T extends HasSin & HasAdd>
.我将 T 传递给该方法。请注意,我不必定义同时包含 HasSin 和 HasAdd 的中间接口(interface)。 (这很棒,因为 n 个接口(interface)导致需要 2^n 个中间接口(interface)来涵盖所有情况)。
我知道 go 不支持泛型。但它能做类似 func(HasSin & HasAdd obj) 的事情吗?它似乎应该支持这种行为。我只是还没有找到以任何方式收紧它的文档。
我看过这个:https://golangbot.com/interfaces-part-2/在文章底部附近有一个类似的例子,但它确实使用了一个中间接口(interface)。
最佳答案
使用函数所需的方法声明一个接口(interface):
type SinAdder interface {
Sin(float64) float64
Add(float64, float64) float64
}
如果您声明了单一方法接口(interface) Siner
和 Adder
,那么您可以根据这些接口(interface)声明 SinAdder
:
type SinAdder interface {
Siner
Adder
}
在函数中使用该接口(interface):
func example(arg SinAdder) {
}
任何具有 Sin 和 Add 方法的值都可以传递给示例。
您可以通过在函数参数中使用匿名接口(interface)定义来避免声明 SinAdder 接口(interface):
func example(arg interface { Siner; Adder }) {
}
关于go - Go 可以避免中间接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55987306/