यह मेरे लिए बहुत अस्पष्ट है कि मैं किस मामले में हमेशा एक पॉइंटर रिसीवर का उपयोग करने के बजाय एक मूल्य रिसीवर का उपयोग करना चाहता हूं।
डॉक्स से रिकैप करने के लिए:
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
डॉक्स भी कहते हैं, "इस तरह के बुनियादी प्रकार, स्लाइस, और छोटे structs के रूप में प्रकार के लिए, एक मूल्य के रिसीवर बहुत सस्ता है, इसलिए जब तक विधि के शब्दों एक सूचक की आवश्यकता है, एक मूल्य के रिसीवर कुशल और स्पष्ट है।"
पहला बिंदु यह कहता है कि यह "बहुत सस्ता" है, लेकिन सवाल यह है कि यह सस्ता है तो सूचक रिसीवर। इसलिए मैंने एक छोटा बेंचमार्क (जीआईएस पर कोड) बनाया, जिसमें मुझे दिखाया गया, कि पॉइंटर रिसीवर एक ऐसी संरचना के लिए और भी तेज है, जिसमें केवल एक स्ट्रिंग फ़ील्ड है। ये परिणाम हैं:
// 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
(संपादित करें: कृपया ध्यान दें कि नए जाने वाले संस्करणों में दूसरा बिंदु अमान्य हो गया, टिप्पणियां देखें) ।
दूसरा बिंदु यह कहता है, यह "कुशल और स्पष्ट" है जो स्वाद का मामला है, है ना? व्यक्तिगत रूप से मैं हर जगह उसी तरह का उपयोग करके संगतता पसंद करता हूं। किस अर्थ में दक्षता? प्रदर्शन के अनुसार ऐसा लगता है कि सूचक लगभग हमेशा अधिक कुशल हैं। कुछ अंतर संपत्ति के साथ कुछ परीक्षण-रन ने मूल्य रिसीवर (0.01-0.1 ns / op की सीमा) का न्यूनतम लाभ दिखाया
क्या कोई मुझे एक ऐसा मामला बता सकता है जहां एक मूल्य रिसीवर स्पष्ट रूप से अधिक समझ में आता है तो एक पॉइंटर रिसीवर? या क्या मैं बेंचमार्क में कुछ गलत कर रहा हूं, क्या मैंने अन्य कारकों की अनदेखी की है?