为什么带指针和非指针接收器的方法在Go中不能有相同的名称?

时间:2016-09-28 22:18:12

标签: pointers methods go types

我的理解是,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

1 个答案:

答案 0 :(得分:6)

Spec: Method sets:

  

任何其他类型T的方法集包含使用接收器类型T声明的所有方法。相应指针类型*T的方法集是使用接收器*TT声明的所有方法的集合(也就是说,它还包含{{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?