见下面的代码:
我有一种奇怪的行为,我在Golang中无法理解。如果我想创建结构的类型别名并且该结构满足接口类型的要求,则类型别名不能满足该接口类型的要求。我不知道为什么会这样。有什么想法吗?
package main
import (
"fmt"
)
type MyInt struct {
value int
}
func (m MyInt) DoubleIt() int {
return m.value * 2
}
type MyInter interface {
DoubleIt() int
}
type MyIntContainer struct {
d MyInter
}
type MC MyIntContainer
type MI MyInt
func main() {
e1 := MyIntContainer{MyInt{12}} //This is OK
fmt.Printf("%d\n", e1.d.DoubleIt())
e2 := MC{MI{12}} //this fails with error - line 29
fmt.Printf("%d\n", e2.d.DoubleIt())
}
错误讯息: 第29行:不能在字段值中使用MI文字(类型MI)作为MyInter类型: MI没有实现MyInter(缺少DoubleIt方法)
答案 0 :(得分:5)
在您的代码中MI
是一种新类型,它不会继承原始类型的方法。 DoubleIt
方法确实不可用:
e2 := MI{12}
fmt.Printf("%d\n", e2.DoubleIt())
e2.DoubleIt undefined (type MI has no field or method DoubleIt)
如果您想继续使用这些方法,可以选择嵌入MyInt
:
type MI struct {
MyInt
}
然后你可以说:
e2 := MI{MyInt{12}}
fmt.Printf("%d\n", e2.DoubleIt())
来自spec:
类型可能具有与之关联的方法集。任何方法集 其他类型T 包含所有使用接收器类型T 声明的方法。进一步的规则适用于包含匿名字段的结构,如 在结构类型一节中描述。 任何其他类型都有空 方法集。