Golang Go语言中 函数的值接收者和指针接收者疑惑

发布于 1周前 作者 phonegap100 来自 Go语言

有人在一篇博文中写到: "使用指针作为方法的接收者的理由:

方法能够修改接收者指向的值; 避免在每次调用方法时复制该值, 在值的类型为大型结构体时, 这样做会更加高效; 但是判断使用值接收者还是指针接收者,不是由该方法是否修改了调用者(也就是接收者)来决定,而是应该基于该类型的本质。

如果类型具备 "原始的本质",也就是说它的成员都是由 go 语言里内置的原始类型,如字符串,整型值等,那就定义值接收者类型的方法。像内置的复合类型,如 slice ,map ,interface ,channel ,这些类型比较特殊,声明他们的时候,实际上是创建了一个 header , 对于他们也是直接定义值接收者类型的方法。这样,调用函数时,是直接 copy 了这些类型的 header ,而 header 本身就是为复制设计的。

如果类型具备非原始的本质,不能被安全地复制,这种类型总是应该被共享,那就定义指针接收者的方法。比如 go 源码里的文件结构体( struct File )就不应该被复制,应该只有一份实体"

对此不是很能理解,什么叫非原始的本质,不能被安全的复制指的到底是什么意思


Golang Go语言中 函数的值接收者和指针接收者疑惑

更多关于Golang Go语言中 函数的值接收者和指针接收者疑惑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

更多关于Golang Go语言中 函数的值接收者和指针接收者疑惑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这有啥惑的,我这种不会 go 的都能猜出来,primitive 类型存的是值,类类型存的是指针呗。

看了下带佬的博客,懂的实在是太多了😄

sync.mutex 复制下试试

也许” 非原始本质”指的是基础类型吧,反正我偶尔也直接*bool 这样用,好像没什么不拖:)

在Golang中,函数的值接收者和指针接收者各有其适用的场景,理解它们之间的差异对于编写高效、健壮的代码至关重要。

值接收者意味着函数接收到的是调用者传递的值的副本。在函数内部对这个副本的任何修改都不会影响到原来的变量。这种方式适用于那些不需要修改原始数据,或者数据较小、复制成本较低的情况。

指针接收者则允许函数直接操作调用者传递的变量的内存地址。这意味着函数内部对数据的修改会直接影响到原始变量。这种方式在需要修改原始数据,或者数据较大、复制成本较高时更为合适。

选择哪种接收者,主要取决于函数的职责以及性能考虑。如果函数只是需要读取数据,那么值接收者通常更合适,因为它提供了更好的封装性和安全性。如果函数需要修改数据,或者数据较大,那么指针接收者可能更为高效。

此外,还需要注意的是,如果某个类型的方法中包含了指针接收者,那么这个类型的其他方法最好也统一使用指针接收者,以保持一致性。这是因为如果混合使用值接收者和指针接收者,可能会导致方法之间的行为不一致,增加代码的复杂性和出错的可能性。

总的来说,选择值接收者还是指针接收者,需要根据具体的场景和需求来决定。理解它们的差异,并合理使用,是编写高质量Go代码的重要一环。

回到顶部