Golang:键入满足接口要求的别名结构

时间:2016-05-29 07:55:52

标签: go

见下面的代码:

我有一种奇怪的行为,我在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方法)

1 个答案:

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