zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Go -- 方法中何时使用值传递何时使用指针共享

2023-03-14 22:47:38 时间

来看一段简单的代码:

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包(文件读取,我们并不希望当我们读取一个文件后,文件进行细胞分裂)