Go 语言中值 receiver 和指针 receiver 的对比(收集的一些资料)

栏目: C · 发布时间: 6年前

内容简介:定义结构方法时的常见困境,你的方法接收器应该使用指针接收器还是值接收器?如果要在方法中更改接收器的状态,操纵它的值,请使用指针接收器。 使用值接收器是不可能的,它按值复制(对值接收器的任何修改都是该副本的本地修改)。如果您定义方法的结构非常大,复制它将比使用值接收器代价更大。

困惑

定义结构方法时的常见困境,你的方法接收器应该使用指针接收器还是值接收器?

type T struct {
    a int
}
func (tv  T) Mv(a int) int         { return 0 }  // value receiver
func (tp *T) Mp(f float32) float32 { return 1 }  // pointer receiver

什么时候使用指针接收器

修改接收器

如果要在方法中更改接收器的状态,操纵它的值,请使用指针接收器。 使用值接收器是不可能的,它按值复制(对值接收器的任何修改都是该副本的本地修改)。

优化

如果您定义方法的结构非常大,复制它将比使用值接收器代价更大。

值接收器在原始类型值的副本上运行,这意味着涉及成本,特别是如果结构非常大,并且接收的指针更有效。

什么时候使用值接收器

  • 如果您不需要编辑接收器值,请使用值接收器。
  • 值接收器是并发安全的,而指针接收器不是并发安全的。

有一种情况,您可能希望将指针接收器用于通常使用值接收器的方法,并且当您在该类型上定义了其他指针接收器时,为了保持一致性,您应该在所有方法中使用指针接收器。

Go CodeReview 注释

选择是否在方法上使用值或指针接收器可能很困难,尤其是对于新的 Go 程序员。

如果有疑问,请使用指针,但有时候值接收器是有意义的,通常是出于效率的原因,例如小的不变结构或基本类型的值。

一些有用的指导:

time.Time

参考资料

  1. receiver-type

茶歇驿站

一个可以让你停下来看一看,在茶歇之余给你帮助的小站,这里的内容主要是后端技术,个人管理,团队管理,以及其他个人杂想。

Go 语言中值 receiver 和指针 receiver 的对比(收集的一些资料)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的算法趣题

程序员的算法趣题

[ 日] 增井敏克 / 绝 云 / 人民邮电出版社 / 2017-7 / 55.00元

本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力、掌握算法精髓。此外,本书作者在谜题解答上,通过算法的关键原理讲解,从思维细节入手,发掘启发性算法新解,并辅以Ruby、JavaScript等不同语言编写的源代码示例,使读者在算法思维与编程实践的分合之间,切实提高编程能力。 本书适合已经学习过排序、搜索等知名算法,并想要学习更多有趣算法以提升编程技巧......一起来看看 《程序员的算法趣题》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具