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


相关文章
|
1月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
50 11
|
9天前
|
Go
|
2月前
|
大数据 Shell Go
GO方法与自定义类型
本文详细介绍了 Go 语言中的自定义数据类型与方法。不同于传统的面向对象编程语言,Go 通过结构体 (`struct`) 和方法 (`method`) 来扩展自定义类型的功能。文章解释了如何定义结构体、创建方法,并探讨了值接收器与指针接收器的区别及应用场景。此外,还介绍了方法的可见性以及接收器的命名惯例。通过具体示例,帮助读者更好地理解和应用这些概念。
|
2月前
|
存储 Go
Go to Learn Go之指针
Go to Learn Go之指针
25 0
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 安全 Java
Go 指针
该文章深入探讨了Go语言中的指针概念,包括指针的获取、使用、限制以及如何安全地返回局部变量的地址,同时讨论了`unsafe.Pointer`在打破指针限制方面的作用。
15 3
|
3月前
|
存储 Ubuntu Go
在Ubuntu 16.04上安装Go 1.6的方法
在Ubuntu 16.04上安装Go 1.6的方法
46 1
|
3月前
|
存储 Ubuntu Go
在Ubuntu 18.04上安装Go的方法
在Ubuntu 18.04上安装Go的方法
50 1
|
3月前
|
存储 Ubuntu Linux
在Ubuntu 14.04上安装Go 1.6的方法
在Ubuntu 14.04上安装Go 1.6的方法
50 1
|
3月前
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用