请参阅下面的代码:
我有一个奇怪的行为,我在围棋中无法理解。如果我想创建结构的类型别名,并且该结构满足接口类型的要求,则类型别名将不满足该接口类型的要求。我不知道为什么会这样。有什么想法吗?
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("%dn", e1.d.DoubleIt())
e2 := MC{MI{12}} //this fails with error - line 29
fmt.Printf("%dn", e2.d.DoubleIt())
}
错误消息:
Line 29: cannot use MI literal (type MI) as type MyInter in field value:
MI does not implement MyInter (missing DoubleIt method)
在你的代码中,MI
是一种新类型,它不会继承原始类型的方法。DoubleIt
方法确实不可用:
e2 := MI{12}
fmt.Printf("%dn", e2.DoubleIt())
e2.DoubleIt undefined (type MI has no field or method DoubleIt)
如果要继承这些方法,另一种方法是嵌入MyInt
:
type MI struct {
MyInt
}
然后你可以说:
e2 := MI{MyInt{12}}
fmt.Printf("%dn", e2.DoubleIt())
从规格:
类型可能具有与之关联的方法集。任何方法集 其他类型 T 由用接收器类型 T 声明的所有方法组成。进一步的规则适用于包含匿名字段的结构,如 在结构类型一节中进行了描述。任何其他类型都有空 方法集。