फ़ंक्शन फ़ंक्शन तर्क मान द्वारा पास किए जाते हैं।
पहले, आइए अपने उदाहरण के अप्रासंगिक भागों को छोड़ दें, ताकि हम आसानी से देख सकें कि आप केवल मूल्य के आधार पर एक तर्क दे रहे हैं। उदाहरण के लिए,
package main
import "fmt"
func byval(q *int) {
fmt.Printf("3. byval -- q %T: &q=%p q=&i=%p *q=i=%v\n", q, &q, q, *q)
*q = 4143
fmt.Printf("4. byval -- q %T: &q=%p q=&i=%p *q=i=%v\n", q, &q, q, *q)
q = nil
}
func main() {
i := int(42)
fmt.Printf("1. main -- i %T: &i=%p i=%v\n", i, &i, i)
p := &i
fmt.Printf("2. main -- p %T: &p=%p p=&i=%p *p=i=%v\n", p, &p, p, *p)
byval(p)
fmt.Printf("5. main -- p %T: &p=%p p=&i=%p *p=i=%v\n", p, &p, p, *p)
fmt.Printf("6. main -- i %T: &i=%p i=%v\n", i, &i, i)
}
आउटपुट:
1. main -- i int: &i=0xf840000040 i=42
2. main -- p *int: &p=0xf8400000f0 p=&i=0xf840000040 *p=i=42
3. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040 *q=i=42
4. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040 *q=i=4143
5. main -- p *int: &p=0xf8400000f0 p=&i=0xf840000040 *p=i=4143
6. main -- i int: &i=0xf840000040 i=4143
समारोह में main
, i
एक है int
स्मृति स्थान पर चर ( &i
) 0xf800000040
एक प्रारंभिक मूल्य के साथ ( i
) 42
।
समारोह में main
, p
एक के लिए सूचक है int
स्मृति स्थान (कम से चर &p
) 0xf8000000f0
एक मूल्य (साथ p
= &i
) 0xf800000040
एक करने के लिए जो अंक int
मूल्य ( *p
= i
) 42
।
समारोह में main
, byval(p)
एक समारोह कॉल जो मूल्य (प्रदान करती है p
= &i
) 0xf800000040
स्मृति स्थान (कम से तर्क के &p
) 0xf8000000f0
कार्य करने के लिए byval
पैरामीटर q
स्मृति स्थान पर ( &q
) 0xf8000000d8
। दूसरे शब्दों में, मेमोरी को byval
पैरामीटर के लिए आवंटित किया जाता है q
और main
byval
तर्क p
का मान इसे सौंपा जाता है; के मूल्यों p
और q
शुरू में ही कर रहे हैं, लेकिन चर p
और q
अलग हैं।
समारोह में byval
, सूचक का उपयोग कर q
( *int
) है, जो सूचक की एक प्रति है p
( *int
), पूर्णांक *q
( i
) एक नई पूर्णांक मान पर सेट है 4143
। लौटने से पहले अंत में। पॉइंटर q
को nil
(शून्य मान) पर सेट किया गया है , जिसका कोई प्रभाव नहीं है p
क्योंकि q
यह एक कॉपी है।
फ़ंक्शन में main
, स्मृति स्थान पर p
एक int
चर के लिए एक संकेतक है ( &p
) 0xf8000000f0
एक मूल्य ( p
= &i
) के साथ 0xf800000040
जो एक नए int
मूल्य ( *p
= i
) को इंगित करता है 4143
।
फ़ंक्शन में main
, एक अंतिम मान ( ) के साथ स्मृति स्थान ( ) पर i
एक int
चर है ।&i
0xf800000040
i
4143
आपके उदाहरण में, फ़ंक्शन कॉल के तर्क के रूप में उपयोग किया जाने वाला फ़ंक्शन main
चर फ़ंक्शन पैरामीटर के समान नहीं है । उनके पास एक ही नाम है, लेकिन विभिन्न स्कोप और मेमोरी स्थानों के साथ अलग-अलग चर हैं। फ़ंक्शन पैरामीटर फ़ंक्शन कॉल तर्क को छुपाता है । यही कारण है कि मेरी उदाहरण में, मैं तर्क और पैरामीटर चर नामित है और क्रमश: अंतर पर जोर देना।s
gotest
gotest
s
s
s
p
q
आपके उदाहरण में, ( &s
) फ़ंक्शन में 0x4930d4
चर के लिए मेमोरी स्थान का पता है जो फ़ंक्शन कॉल के तर्क के रूप में उपयोग किया जाता है , और फ़ंक्शन पैरामीटर के लिए मेमोरी स्थान का पता है । यदि आप फ़ंक्शन के अंत में पैरामीटर सेट करते हैं , तो इसका वेरिएबल पर कोई प्रभाव नहीं पड़ता है ; में और में विशिष्ट स्मृति स्थान नहीं है। प्रकारों के संदर्भ में, है , है , और है । एक पॉइंटर टू (मैमोरी लोकेशन का पता) है , जो कि पाइंटर टू (मेमोरी लोकेशन का पता) एक गुमनाम वैरायटी का प्रकार हैs
main
gotest(s, done)
0x4974d8
gotest
s
s = nil
gotest
s
main
s
main
s
gotest
&s
**Something
s
*Something
*s
Something
&s
s
Something
। मूल्यों के संदर्भ में, main.&s != gotest.&s
, main.s == gotest.s
, main.*s == gotest.*s
, और main.s.number == gotest.s.number
।
आपको mkb की ऋषि सलाह लेनी चाहिए और इसका उपयोग बंद कर देना चाहिए println(&s)
। fmt
उदाहरण के लिए पैकेज का उपयोग करें ,
fmt.Printf("%v %p %v\n", &s, s, *s)
जब वे एक ही मेमोरी लोकेशन की ओर इशारा करते हैं तो पॉइंटर्स का एक ही मूल्य होता है; जब वे अलग-अलग मेमोरी स्थानों पर इंगित करते हैं तो पॉइंटर्स के अलग-अलग मूल्य होते हैं।