非指针方法在什么时候使用?

2019-01-28 01:16:06 +08:00
 xeaglex

我们都知道,Go 语言中的方法有两种,指针方法和非指针方法(其实我不确定是否叫这名)。其区别在于,调用非指针方法时,调用者会被拷贝。

func (r *Receiver)F() // 指针方法
func (r Receiver)F() // 非指针方法

用了一段时间 Go 以后,我发现,我从来没用过非指针方法,因为我认为额外的拷贝工作会造成性能的损失。我猜这是因为我用的时间太短,没遇到必须使用非指针方法的场景。

那么问题来了,到底什么情况下必须使用非指针方法,或使用非指针方法更优呢?

4061 次点击
所在节点    Go 编程语言
13 条回复
Trim21
2019-01-28 01:22:31 +08:00
obj.copy(), obj.clone() ((((
bigpigeon
2019-01-28 01:27:11 +08:00
我记得 go 初始教程就有讲的,go 的 method 就是个函数语法糖
指针方法等于 func F(r *Receiver)
非指针就是 func F(r Receiver)
blless
2019-01-28 02:51:54 +08:00
值类型跟引用类型分得清不,差不多类似,比如 time.Time 类型就是基本都是用值类型,然后它的操作方法就基本都是非指针方法
blless
2019-01-28 02:57:06 +08:00
想了想感觉没说清楚,只是举个例子,还是先了解一下值类型传递跟引用类型传递概念吧
janxin
2019-01-28 07:38:10 +08:00
zjdznl
2019-01-28 07:41:02 +08:00
当你不确定用什么的时候,用指针 receive 就行了。
reus
2019-01-28 08:47:40 +08:00
不要看到复制就以为性能低,内存复制很快的,用指针还要解指针,一样是要付出代价的
不需要改变的对象,就用值,需要改变的,就用指针
freestyle
2019-01-28 09:42:34 +08:00
传值用于字段不多的结构体的除了改值和反射的情况. https://segment.com/blog/allocation-efficiency-in-high-performance-go-services
myyou
2019-01-28 09:49:42 +08:00
指针多了并不一定增加性能,反而会增加 gc 压力,从而降低性能
bumz
2019-01-28 16:58:42 +08:00
当你的 struct 只有 a few words,并且不需要修改,比如值语义的时候
neoblackcap
2019-01-28 17:30:24 +08:00
需要修改实例就用指针,不需要就用非指针版本。
xeaglex
2019-01-29 00:50:49 +08:00
@reus 谢谢
xeaglex
2019-01-29 00:52:10 +08:00
@myyou 谢谢,这么说就很明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/531109

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX