拿下面这段代码:
type A struct { … }
func (a *A) Attr() int { … }
type B struct { … }
func (b *B) Attr() int { … }
type I interface{
Attr() int
}
func (m that implements I) Process() int {
do something with m.Attr()
}
func main() {
a := A{}
a.Process()
b := B{}
b.Process()
}
不能在接口(interface)上定义方法,因此 m
不能是 I
类型。我尝试在 A
和 B
上使用匿名字段,但 Attr
是特定于关联结构的,因此它不能在匿名字段上实现。
我想避免在 A
和 B
上复制/粘贴 Process()
方法,因为它们完全相同。我可以简单地定义
func Process(m I) int { … }
相反,但它不是很优雅。
您将如何以可行的方式执行此操作?
最佳答案
这在 Go 中目前是不可能的。虽然您可以通过在结构中嵌入另一种类型来为多种类型引入通用方法,但这些方法并不知道它们所嵌入的类型。
此模式的常用 Go 习惯用法是使用函数。例如,sort
package来自标准库。它defines an interface由在容器上实现排序算法所需的方法组成(Len
、Less
和 Swap
)。然而,实际的排序算法is exposed as a function它采用实现接口(interface)的参数。
关于go - 在实现相同接口(interface)的多个结构上定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27452427/