为了账号安全,请及时绑定邮箱和手机立即绑定

值接收器与指针接收器

值接收器与指针接收器

缥缈止盈 2019-12-09 15:14:24
对于我来说,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。回顾一下文档:type T struct {    a int}func (tv  T) Mv(a int) int         { return 0 }  // value receiverfunc (tp *T) Mp(f float32) float32 { return 1 }  // pointer receiver该文档还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器将是高效且清晰的。”首先,它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结构,指针接收器也更快。结果如下:// Struct one empty string propertyBenchmarkChangePointerReceiver  2000000000               0.36 ns/opBenchmarkChangeItValueReceiver  500000000                3.62 ns/op// Struct one zero int propertyBenchmarkChangePointerReceiver  2000000000               0.36 ns/opBenchmarkChangeItValueReceiver  2000000000               0.36 ns/op(编辑:请注意,第二点在较新的go版本中变得无效,请参阅注释)。第二点说,这是“高效而清晰的”,更多的是品味问题,不是吗?就个人而言,我更喜欢在各处使用相同的方式来保持一致性。效率在什么意义上?在性能方面似乎指针几乎总是更高效。具有int属性的测试很少显示Value接收器的最小优势(范围为0.01-0.1 ns / op)有人可以告诉我一个值接收器比指针接收器更有意义的情况吗?还是我在基准测试中做错了什么,我是否忽略了其他因素?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 478 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信