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

Wol*_*ang 3 methods types pointers go

我的理解是Cat*Cat不同类型的搜索.那为什么他们的名字会发生冲突

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
}
Run Code Online (Sandbox Code Playgroud)

漫画回复:

方法重新声明:Cat.GetName

icz*_*cza 6

规格:方法集:

任何其他类型的方法集T包含用接收器类型声明的所有方法T.设置相应的指针型的方法*T该组的与接收器声明的所有方法*TT(即,它也包含的方法集T).

因此,如果您有一个方法Cat作为接收器类型,该方法也是方法集的一部分*Cat.因此,*Cat已经有了这种方法,试图声明具有相同名称的"另一个",并且*Cat接收器类型将是重复的.

要验证它,请参阅此示例:

type Cat struct{ Name string }

func (c Cat) GetName() string { return c.Name }
Run Code Online (Sandbox Code Playgroud)

我们只用非指针接收器声明一个方法.如果我们检查/打印相应*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)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

GetName
Run Code Online (Sandbox Code Playgroud)

该类型*Cat已经有一个GetName方法.添加另一个*Cat接收器将与上面的一个碰撞.

官方FAQ中的相关问题:为什么Go不支持方法和运算符的重载?