Sangat tidak jelas bagi saya dalam hal ini saya ingin menggunakan penerima nilai daripada selalu menggunakan penerima penunjuk.
Ringkasan dari dokumen:
type T struct {
a int
}
func (tv T) Mv(a int) int { return 0 } // value receiver
func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver
The docs mengatakan juga "Untuk jenis seperti tipe dasar, iris, dan struct kecil, penerima nilai sangat murah jadi kecuali semantik metode membutuhkan pointer, penerima nilai efisien dan jelas."
Poin pertama dikatakan "sangat murah", tetapi pertanyaannya adalah apakah lebih murah dari pada penerima pointer. Jadi saya membuat patokan kecil (kode pada intinya) yang menunjukkan kepada saya, penerima penunjuk itu lebih cepat bahkan untuk struct yang hanya memiliki satu bidang string. Inilah hasilnya:
// Struct one empty string property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 500000000 3.62 ns/op
// Struct one zero int property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 2000000000 0.36 ns/op
(Edit: Harap dicatat bahwa poin kedua menjadi tidak valid di versi go yang lebih baru, lihat komentar) .
Poin kedua mengatakan, "efisien dan jelas" yang lebih merupakan masalah selera, bukan? Secara pribadi saya lebih suka konsistensi dengan menggunakan cara yang sama di mana-mana. Efisiensi dalam arti apa? kinerja bijaksana tampaknya penunjuk hampir selalu lebih efisien. Beberapa uji coba dengan satu properti int menunjukkan keuntungan minimal penerima Nilai (kisaran 0,01-0,1 ns / op)
Dapatkah seseorang memberi tahu saya kasus di mana penerima nilai jelas lebih masuk akal daripada penerima penunjuk? Atau apakah saya melakukan sesuatu yang salah dalam benchmark, apakah saya mengabaikan faktor-faktor lain?