2016-05-29 113 views
-1

請參閱下面的代碼:Golang:符合接口要求的類型別名結構

我有一種奇怪的行爲,我無法在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法)

回答

4

在你的代碼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

A型可具有與之相關聯的方法集。任何 的方法組其他類型T包括用接收器類型T聲明的所有方法。其他規則適用於包含匿名字段的結構,如結構類型一節中所述的 。 任何其他類型有一個空 方法集