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月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
308 2
|
10月前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
273 34
|
10月前
|
Go 开发者
Go语言内存共享与扩容机制 -《Go语言实战指南》
本文深入探讨了Go语言中切片的内存共享机制与自动扩容策略。切片作为动态数组的抽象,其底层结构包含指针、长度和容量。多个切片可能共享同一底层数组,修改一个切片可能影响其他切片。当切片容量不足时,`append`会触发扩容,新容量按指数增长以优化性能。为避免共享导致的副作用,可通过`copy`创建独立副本或在函数中使用只读方式处理。最后总结了最佳实践,帮助开发者高效使用切片,写出更优代码。
253 10
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
333 11
|
大数据 Shell Go
GO方法与自定义类型
本文详细介绍了 Go 语言中的自定义数据类型与方法。不同于传统的面向对象编程语言,Go 通过结构体 (`struct`) 和方法 (`method`) 来扩展自定义类型的功能。文章解释了如何定义结构体、创建方法,并探讨了值接收器与指针接收器的区别及应用场景。此外,还介绍了方法的可见性以及接收器的命名惯例。通过具体示例,帮助读者更好地理解和应用这些概念。
198 2
|
Go
Go语言切片深入解析:按值传递的奥秘
【10月更文挑战第27天】
203 0
|
存储 安全 Java
Go 指针
该文章深入探讨了Go语言中的指针概念,包括指针的获取、使用、限制以及如何安全地返回局部变量的地址,同时讨论了`unsafe.Pointer`在打破指针限制方面的作用。
110 3
|
存储 Ubuntu Go
在Ubuntu 16.04上安装Go 1.6的方法
在Ubuntu 16.04上安装Go 1.6的方法
266 1
|
存储 Ubuntu Go
在Ubuntu 18.04上安装Go的方法
在Ubuntu 18.04上安装Go的方法
374 1
|
存储 Ubuntu Linux
在Ubuntu 14.04上安装Go 1.6的方法
在Ubuntu 14.04上安装Go 1.6的方法
240 1