有人在一篇博文中写到: "使用指针作为方法的接收者的理由:
方法能够修改接收者指向的值; 避免在每次调用方法时复制该值, 在值的类型为大型结构体时, 这样做会更加高效; 但是判断使用值接收者还是指针接收者,不是由该方法是否修改了调用者(也就是接收者)来决定,而是应该基于该类型的本质。
如果类型具备 "原始的本质",也就是说它的成员都是由 go 语言里内置的原始类型,如字符串,整型值等,那就定义值接收者类型的方法。像内置的复合类型,如 slice ,map ,interface ,channel ,这些类型比较特殊,声明他们的时候,实际上是创建了一个 header , 对于他们也是直接定义值接收者类型的方法。这样,调用函数时,是直接 copy 了这些类型的 header ,而 header 本身就是为复制设计的。
如果类型具备非原始的本质,不能被安全地复制,这种类型总是应该被共享,那就定义指针接收者的方法。比如 go 源码里的文件结构体( struct File )就不应该被复制,应该只有一份实体"
对此不是很能理解,什么叫非原始的本质,不能被安全的复制指的到底是什么意思
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.