Benim için çok net değil, bu durumda her zaman bir işaretçi alıcı kullanmak yerine bir değer alıcısı kullanmak isterdim.
Dokümanlardan özetlemek için:
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
Dokümanlar "terimi, temel tipleri, dilimler ve küçük yapılar gibi türleri için, bir değer, alıcı çok ucuz yöntemin semantik bir işaretçi gerektirmedikçe bu nedenle, bir değer alıcı etkili ve açıktır." De der
İlk nokta bunun "çok ucuz" olduğunu söylüyor, ama soru daha çok işaretçi alıcıdan daha ucuz olması. Bu yüzden küçük bir kıyaslama yaptım (ana hattaki kod) bana gösterici alıcısının sadece bir string alanı olan bir yapı için bile daha hızlı olduğunu gösterdi. Sonuçlar şunlardır:
// 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
(Düzenleme: Lütfen daha yeni go sürümlerinde ikinci noktanın geçersiz olduğunu unutmayın, yorumlara bakın) .
İkinci nokta diyor ki, "verimli ve net" ki bu daha çok zevk meselesi, değil mi? Şahsen ben tutarlılığı her yerde aynı şekilde kullanarak tercih ederim. Hangi anlamda verimlilik? performans açısından, işaretçi neredeyse her zaman daha verimli görünüyor. Tek bir int özelliğine sahip birkaç test çalışması, Değer alıcısının minimum avantajını gösterdi (0.01-0.1 ns / op aralığı)
Birisi bana bir değer alıcısının açıkça işaretçi alıcıdan daha mantıklı olduğu bir durumu söyleyebilir mi? Yoksa kıyaslamada yanlış bir şey mi yapıyorum, diğer faktörleri göz ardı ettim mi?