रिसीवर और इंटरफेस
मान रिसीवर वाले विधि को न केवल मानों बल्कि पॉइंटर द्वारा भी कॉल किया जा सकता है।
पॉइंटर रिसीवर वाली विधियों को केवल पॉइंटर या पता लगाया जा सकने वाले मान का उपयोग करके कॉल किया जा सकता है।
उदाहरण के लिए,
type S struct {
data string
}
func (s S) Read() string {
return s.data
}
func (s *S) Write(str string) {
s.data = str
}
sVals := map[int]S{1: {"A"}}
// आप केवल मान का उपयोग करके Read को कॉल कर सकते हैं
sVals[1].Read()
// यह कंपाइल नहीं होगा:
// sVals[1].Write("test")
sPtrs := map[int]*S{1: {"A"}}
// Read और Write विधियाँ दोनों पॉइंटर का उपयोग करके कॉल की जा सकती हैं
sPtrs[1].Read()
sPtrs[1].Write("test")
इसी तरह, यद्यपि विधि में मान रिसीवर हो, तो यह एक इंटरफेस को एक पॉइंटर रिसीवर का उपयोग करके पूरा कर सकती है।
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}
var i F
i = s1Val
i = s1Ptr
i = s2Ptr
// निम्नलिखित कोड कंपाइल नहीं होगा क्योंकि s2Val मान है और S2 की f विधि में मान रिसीवर नहीं है
// i = s2Val
Effective Go में पॉइंटर बनाम मान के बारे में शानदार व्याख्यान है।
अतिरिक्त नोट:
- एक प्रकार के विधि सेट मान रिसीवर के साथ और एक प्रकार के विधि सेट पॉइंटर रिसीवर के साथ हो सकते हैं
- विधि सेट मान रिसीवर की विध