對于我來說,目前尚不清楚,在這種情況下,我想使用值接收器而不是始終使用指針接收器?;仡櫼幌挛臋n: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該文檔還說:“對于基本類型,切片和小型結構之類的類型,值接收器非常便宜,因此,除非該方法的語義要求使用指針,否則值接收器將是高效且清晰的?!笔紫龋f“非常便宜”,但問題是它比指針接收器便宜。因此,我做了一個小的基準測試(基于要點的代碼),向我展示了,即使對于只有一個字符串字段的結構,指針接收器也更快。結果如下:// 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 回答
- 0 關注
- 538 瀏覽
添加回答
舉報
0/150
提交
取消