采取以下代码:
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()
}
无法在接口上定义方法,因此m
不能是I
类型。我尝试在A
和B
上使用匿名字段,但Attr
特定于关联的结构,因此无法在匿名字段上实现。
我希望避免在Process()
和A
上复制/粘贴B
方法,因为它完全相同。我可以简单地定义
func Process(m I) int { … }
相反,但它不是很优雅。
你将如何继续这样做?
答案 0 :(得分:1)
Go目前无法实现。虽然您可以通过在结构中嵌入另一种类型来向多种类型引入常用方法,但这些方法不了解它们嵌入的类型。
这种模式的常用Go成语是使用一个函数。例如,标准库中的sort
package。它defines an interface由在容器(Len
,Less
和Swap
上实现排序算法所需的方法组成。但是,实际排序算法is exposed as a function采用实现接口的参数。