来看一段简单的代码:
package main import ( "fmt" ) type a struct { number int } func (A a) callMeMsg() { fmt.Println("电话号码是:", A.number) } // 传递的是指针,共享的是底层的数据结构,在其中修改值会影响到调用者 func (A *a) changeNumber(newNumber int) { A.number = newNumber } // 传递的是值的副本,在其中修改值并不会影响调用者 //func (A a) changeNumber(newNumber int) { // A.number = newNumber //} func main() { var a1 = a{number: 123} a1.changeNumber(111) a1.callMeMsg() }
上面的代码告诉我们:值传递不会影响调用方,指针共享会影响调用方
我们何时使用值传递还是指针共享呢?
基于类的本质
考虑,而不是考虑是否修改了值。
如果我们这个类的对象在调用方法时是新增一个对象,哪我们应该使用值传递
如果我们这个类的对象调用方法时是对这个调用对象进行覆盖,那我们可以选择使用指针共享
经典的值传递:数字的运算(新增一个结果对象),time包(时间不可变,对与时间的操作都是生成一个新的时间对象)
典型的指针共享:File包(文件读取,我们并不希望当我们读取一个文件后,文件进行细胞分裂)