[英]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*T
或T
聲明的所有方法的集合(也就是說,它還包含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.