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


相关文章
|
8天前
|
Go
go反射获取变量类型、值、结构体成员、结构体方法
go反射获取变量类型、值、结构体成员、结构体方法
10 0
|
8天前
|
Go
go值传递和引用传递
go值传递和引用传递
8 0
|
14天前
|
Go
go基础语法结束篇 ——函数与方法
go基础语法结束篇 ——函数与方法
|
22天前
|
JSON Go 数据格式
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(4)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
22天前
|
Java 编译器 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(3)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
22天前
|
存储 安全 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(2)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
22天前
|
Java Go 索引
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(1)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
24天前
|
Go
如何理解Go语言中的值接收者和指针接收者?
Go语言中,函数和方法可使用值或指针接收者。值接收者是参数副本,内部修改不影响原值,如示例中`ChangeValue`无法改变`MyStruct`的`Value`。指针接收者则允许修改原值,因为传递的是内存地址。选择接收者类型应基于是否需要修改参数,值接收者用于防止修改,指针接收者用于允许修改。理解这一区别对编写高效Go代码至关重要。
|
2月前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
26 0
|
2月前
|
存储 Go
Go 语言指针
Go 语言指针
16 0