2016-09-28 45 views
3

我的理解是,Cat*Cat是Go中的不同類型。那爲什麼他們的名字相沖突?爲什麼不能在Go中使用指針和非指針接收器的方法?

type Animal interface { 
    GetName() string 
    SetName(string) 
} 

type Cat struct { 
    Name string 
} 

func (c *Cat) GetName() string { 
    return c.Name 
} 

func (c Cat) GetName() string { 
    return c.Name 
} 

func (c *Cat) SetName(s string) { 
    c.Name = s 
} 

Comiler響應:

方法重新聲明:Cat.GetName

+1

它要麼是一個錯誤或實施的故意一部分,因爲有方法的兩個版本只是愚蠢。這就是解引用/地址。如果你有一個指針或一個實例,你可以很容易地得到另一個。 – evanmcdonnal

+0

考慮'interface {GetName()string}'如果將一個實現此接口的結構傳遞給一個將該接口作爲參數的函數,哪個方法會被調用? – mpm

回答

6

Spec: Method sets:

任何其它類型的T的方法集包括與接收器聲明的所有方法鍵入T。相應的指針類型*T的方法集合是所有用接收方*TT(也包含方法集合T)聲明的方法集合。

所以,如果你有Cat作爲接收器類型的方法,該方法也是*Cat方法集的一部分。因此*Cat將已經有該方法,試圖聲明「另一個」具有相同的名稱和*Cat接收器類型將是重複的。

爲了驗證它,看看這個例子:

type Cat struct{ Name string } 

func (c Cat) GetName() string { return c.Name } 

我們只有一個申報法非指針接收器。如果我們檢查/打印相應*Cat類型的方法:

func main() { 
    var cp *Cat = &Cat{} // Pointer 
    t := reflect.TypeOf(cp) 
    for i := 0; i < t.NumMethod(); i++ { 
     fmt.Println(t.Method(i).Name) 
    } 
} 

輸出(嘗試在Go Playground):

GetName 

類型*Cat已經有一個GetName方法。用*Cat接收器添加另一個會與上面的接收器發生碰撞。從官方FAQ

相關問題:Why does Go not support overloading of methods and operators?