簡體   English   中英

為什么帶指針和非指針接收器的方法在Go中不能同名?

[英]Why can't methods with pointer and non-pointer receivers have the same name in Go?

我的理解是Cat*Cat在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
}

漫畫回復:

方法重新聲明:Cat.GetName

規格:方法集:

任何其他類型T的方法集由用接收器類型T聲明的所有方法組成。 相應指針類型*T的方法集是用receiver *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中的相關問題: 為什么Go不支持方法和運算符的重載?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM