满足接口要求的类型别名结构



请参阅下面的代码:

我有一个奇怪的行为,我在围棋中无法理解。如果我想创建结构的类型别名,并且该结构满足接口类型的要求,则类型别名将不满足该接口类型的要求。我不知道为什么会这样。有什么想法吗?

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 声明的所有方法组成。进一步的规则适用于包含匿名字段的结构,如 在结构类型一节中进行了描述。任何其他类型都有空 方法集

最新更新