我的理解是,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
}
Comiler回复:
重新声明的方法:Cat.GetName
答案 0 :(得分:6)
任何其他类型
T
的方法集包含使用接收器类型T
声明的所有方法。相应指针类型*T
的方法集是使用接收器*T
或T
声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。强>
因此,如果您有一个T
作为接收器类型的方法,那么该方法也是Cat
方法集的一部分。所以*Cat
已经有了这种方法,试图宣布"另一个"与接收者类型相同的名称和*Cat
将是重复的。
要验证它,请参阅此示例:
*Cat
我们只用非指针接收器声明一个方法。如果我们检查/打印相应type Cat struct{ Name string }
func (c Cat) GetName() string { return c.Name }
类型的方法:
*Cat
输出(在Go Playground上尝试):
func main() {
var cp *Cat = &Cat{} // Pointer
t := reflect.TypeOf(cp)
for i := 0; i < t.NumMethod(); i++ {
fmt.Println(t.Method(i).Name)
}
}
GetName
类型已经有*Cat
方法。添加另一个GetName
接收器将与上面的一个碰撞。
官方常见问题解答中的相关问题:Why does Go not support overloading of methods and operators?