Go method 指向receiver,指针或是本身怎么样效果一样?

代码在这里:

http://play.golang.org/p/koMmlbmwYk

代码:

package main

import "fmt"

type Human struct {
    name  string
    age   int
    phone string
}

type Student struct {
    Human  //匿名字段
    school string
}

type Employee struct {
    Human   //匿名字段
    company string
}

//Human定义method
func (h *Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

//Employee的method重写Human的method
func (e *Employee) SayHi() {
    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
        e.company, e.phone) //Yes you can split into 2 lines here.
}

func main() {
    mark := Student{Human{"Mark", 25, "222-222-YYYY"}, "MIT"}
    sam := Employee{Human{"Sam", 45, "111-888-XXXX"}, "Golang Inc"}

    mark.SayHi()
    sam.SayHi()
}

对于这句:

//Human定义method
func (h *Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

//Employee的method重写Human的method
func (e *Employee) SayHi() {
    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
        e.company, e.phone) //Yes you can split into 2 lines here.
}

receiver是指向Houman的指针,但如果我改成这样:

//Human定义method
func (h Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

//Employee的method重写Human的method
func (e Employee) SayHi() {
    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
        e.company, e.phone) //Yes you can split into 2 lines here.
}

针向本身,结果输出效果是一样的。

这是怎么回事呢?

阅读 5k
3 个回答

不是这样理解的
首先要区分好函数和方法
方法定义:有接受者的函数叫做方法
至于使用函数还是方法完全是由程序员自己决定的,但是如果想要满足接口(interface{})就只能使用方法,如果没有这方面的需求,那你就使用函数吧
go本身就有这个隐式转换特性,如:

如果t可以获取地址,并且&t的方法中包含d,那么t.d()是(&t).d()的更短写法
工作原理:go首先会查找T类型的变量t的方法列表(看有没有d方法),如果没有找到就会再查找*T类型的方法列表,如果有,会自动转化为(&t).d(),这也是go的一个重要特性

新手上路,请多包涵

*receiver.method 包含所有的 receiver.method,当然前提是这个receiver.method是可寻址的,反过来则不然

推荐问题
宣传栏