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

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

来看一段简单的代码:

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


相关文章
|
5天前
|
存储 Ubuntu Go
在Ubuntu 16.04上安装Go 1.6的方法
在Ubuntu 16.04上安装Go 1.6的方法
12 1
|
5天前
|
存储 Ubuntu Go
在Ubuntu 18.04上安装Go的方法
在Ubuntu 18.04上安装Go的方法
8 1
|
5天前
|
存储 Ubuntu Linux
在Ubuntu 14.04上安装Go 1.6的方法
在Ubuntu 14.04上安装Go 1.6的方法
12 1
|
13天前
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用
|
12天前
|
Go
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
|
12天前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
22天前
|
存储 Go
go切片和指针切片
go切片和指针切片
14 2
|
6天前
|
人工智能 Go
go切片参数传递用值还是指针
go切片参数传递用值还是指针
11 0
|
6天前
|
存储 人工智能 Java
深入理解 go reflect - 要不要传指针
深入理解 go reflect - 要不要传指针
5 0
|
12天前
|
运维 监控 算法
[go 面试] 优化线上故障排查与性能问题的方法
[go 面试] 优化线上故障排查与性能问题的方法