Golang 方法中指针传值的陷阱

Jackey Golang 2,895 次浏览 , 1条评论
package main

import "fmt"

type Person struct {
  Name string
}

func (p Person) test1()  {
  p.Name = "www.gopher.cc"
  fmt.Println(p.Name)
}

func (p *Person) test2()  {
  p.Name = "www.gopher.cc"
  fmt.Println(p.Name)
}

func main()  {
  p := new(Person) // 此处p为指针类型

  p.Name = "gopher.cc"
  p.test1() // 形式上传入的是指针,实际上却是值拷贝
  fmt.Println(p.Name)

  p2 := Person{} // 此处为值类型
  p2.Name = "gopher.cc"
  p2.test2() // 形式上传入的是值类型,实际上是却是地址拷贝
  fmt.Println(p2.Name)
}

总结:

  1. 不管调用形式如何,真正决定是值拷贝还是地址拷贝,看这个方法是和哪种类型绑定;
  2. 如果是和值类型绑定,比如 (p Person) , 则是值拷贝;如果是和指针类型绑定,比如是(p *Person) 则是地址拷贝。

一条评论

  1. 磊哥松松推广 2020年3月7日 下午4:03 回复

    来看看!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go