golang方法指向接收器

时间:2014-06-10 02:29:34

标签: pointers go

我有以下结构和:

type Person struct {
    Name    string
}


steve := Person{Name: "Steve"}

你能解释下面两种方法(一种没有指针,一种没有指针)都能打印p.Name吗?

func (p *Person) Yell() {
    fmt.Println("Hi, my name is", p.Name)
}

func (p Person) Yell(){
    fmt.Println("YELLING MY NAME IS", p.Name)
}

steve.Yell()

直接指向Person(不是实例史蒂夫?)

时,名称不存在吗?

1 个答案:

答案 0 :(得分:4)

两者都指向实例,但是每次调用函数时(p Person)指向一个新副本,其中(p *Person)将始终指向同一个实例。

检查this示例:

func (p Person) Copy() {
    p.Name = "Copy"
}

func (p *Person) Ptr() {
    p.Name = "Ptr"
}

func main() {
    p1, p2 := Person{"Steve"}, Person{"Mike"}
    p1.Copy()
    p2.Ptr()
    fmt.Println("copy", p1.Name)
    fmt.Println("ptr", p2.Name)
}

另请阅读Effective Go,它是该语言的绝佳资源。