go - Go 可以避免中间接口(interface)吗?

标签 go

我正在尝试查看 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) SinerAdder,那么您可以根据这些接口(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/

相关文章:

go - 无法弄清楚为什么这个循环是数据竞争

go - 将命名参数传递给 Golang 工具并使用它们的最简洁方法是什么?

pointers - 指向结构的指针更改未反射(reflect)在调用者中

go - 多个 docker 容器日志

go - 在 vagrant vbox 上安装 golang 1.10

arrays - 将字符串数组复制到字符串指针数组

go - Go中的 '*'和 '&'符号是什么意思?

multithreading - App Engine Channel API 的线程安全/原子性

mongodb - 如何设置 slice 中的所有数据,使用 mgo 从 mongodb 获取?

go - 系统休眠后 time.Time.Sub() 计算错误