2

[Go 函数的值接收者和指针接收者]疑惑

 2 years ago
source link: https://www.v2ex.com/t/844478
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Go 编程语言

[Go 函数的值接收者和指针接收者]疑惑

  MoonWalker · 15 小时 6 分钟前 · 438 次点击

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK