गो लैंग्वेज स्पेसिफिकेशन ( पता ऑपरेटर ) एक संख्यात्मक स्थिरांक का पता लेने की अनुमति नहीं देता है (न तो अप्रकाशित और न ही टाइप किए गए स्थिरांक की)।
ऑपरेंड को पता योग्य होना चाहिए , अर्थात, एक चर, सूचक अप्रत्यक्ष, या स्लाइस इंडेक्सिंग ऑपरेशन; या एक पता योग्य संरचना के क्षेत्र का चयनकर्ता; या किसी पता योग्य सरणी का एक सरणी अनुक्रमण ऑपरेशन। पते की आवश्यकता के अपवाद के रूप में, x
[की अभिव्यक्ति में &x
] एक भी हो सकता है (संभवतः कोष्ठबद्ध) समग्र शाब्दिक ।
तर्क के लिए यह अनुमति क्यों नहीं है, संबंधित प्रश्न देखें: जाने में निरंतर का पता लगाएं । एक समान प्रश्न (इसी तरह इसका पता लेने की अनुमति नहीं है): मैं गो में एक ऑपरेशन के परिणाम के संदर्भ को कैसे स्टोर कर सकता हूं?
आपके विकल्प (सभी खेल के मैदान पर प्रयास करें ):
1) के साथ new()
आप बस new()
एक नया शून्य- मान आवंटित करने int64
और उसका पता प्राप्त करने के लिए बिल्टिन फ़ंक्शन का उपयोग कर सकते हैं :
instance := SomeType{
SomeField: new(int64),
}
लेकिन ध्यान दें कि इसका उपयोग किसी भी प्रकार के शून्य मान को इंगित करने और प्राप्त करने के लिए किया जा सकता है।
2) सहायक चर के साथ
गैर-शून्य तत्वों के लिए सरल और अनुशंसित एक सहायक चर का उपयोग करना है जिसका पता लिया जा सकता है:
helper := int64(2)
instance2 := SomeType{
SomeField: &helper,
}
3) सहायक समारोह के साथ
नोट: एक गैर-शून्य मान के लिए एक पॉइंटर प्राप्त करने के लिए हेल्पर फ़ंक्शंस मेरी github.com/icza/gox
लाइब्रेरी में, gox
पैकेज में उपलब्ध हैं , इसलिए आपको इन सभी को अपनी सभी परियोजनाओं में शामिल करने की ज़रूरत नहीं है जहाँ आपको इसकी आवश्यकता है।
या यदि आपको कई बार इसकी आवश्यकता होती है, तो आप एक सहायक फ़ंक्शन बना सकते हैं जो आवंटित करता है और एक रिटर्न देता है *int64
:
func create(x int64) *int64 {
return &x
}
और इसका उपयोग कर रहे हैं:
instance3 := SomeType{
SomeField: create(3),
}
ध्यान दें कि हमने वास्तव में कुछ भी आवंटित नहीं किया था, गो संकलक ने यह किया कि जब हम फ़ंक्शन तर्क का पता लौटाते हैं। यदि वे फ़ंक्शन से बच सकते हैं, तो गो कंपाइलर एस्केप एनालिसिस करता है, और ढेर पर स्थानीय वेरिएबल्स (स्टैक के बजाय) आवंटित करता है। विवरण के लिए, देखें क्या गो फ़ंक्शन में स्थानीय सरणी का एक टुकड़ा सुरक्षित है?
4) एक-लाइनर अनाम फ़ंक्शन के साथ
instance4 := SomeType{
SomeField: func() *int64 { i := int64(4); return &i }(),
}
या एक (कम) विकल्प के रूप में:
instance4 := SomeType{
SomeField: func(i int64) *int64 { return &i }(4),
}
5) स्लाइस शाब्दिक, अनुक्रमण और पते के साथ
यदि आप के *SomeField
अलावा अन्य होना चाहते हैं 0
, तो आपको कुछ पता करने की आवश्यकता है।
आप अभी भी ऐसा कर सकते हैं, लेकिन यह बदसूरत है:
instance5 := SomeType{
SomeField: &[]int64{5}[0],
}
fmt.Println(*instance2.SomeField) // Prints 5
यहां क्या होता है एक []int64
टुकड़ा एक शाब्दिक के साथ बनाया जाता है, जिसमें एक तत्व ( 5
) होता है। और इसे अनुक्रमित (0 तत्व) किया जाता है और 0 तत्व का पता लिया जाता है। पृष्ठभूमि में [1]int64
वसीयत की एक सरणी भी आवंटित की जाएगी और स्लाइस के लिए बैकिंग ऐरे के रूप में उपयोग की जाएगी। इसलिए यहां बहुत अधिक बॉयलरप्लेट है।
6) एक सहायक संरचनात्मक शाब्दिक के साथ
आइए अपवाद की आवश्यकताओं के अपवाद की जांच करें:
पते की आवश्यकता के अपवाद के रूप में, x
[की अभिव्यक्ति में &x
] एक भी हो सकता है (संभवतः कोष्ठबद्ध) समग्र शाब्दिक ।
इसका मतलब है कि एक समग्र शाब्दिक का पता, उदाहरण के लिए एक संरचनात्मक शाब्दिक ठीक है। यदि हम ऐसा करते हैं, तो हमारे पास आवंटित मूल्य और इसके लिए प्राप्त एक सूचक होगा। लेकिन अगर ऐसा है, तो एक और आवश्यकता हमारे लिए उपलब्ध हो जाएगी: "एक पता योग्य संरचनात्मक ऑपरेंड का क्षेत्र चयनकर्ता" । तो अगर स्ट्रक्चर शाब्दिक में फ़ील्ड का प्रकार होता है int64
, तो हम उस फ़ील्ड का पता भी ले सकते हैं!
इस विकल्प को कार्रवाई में देखते हैं। हम इस आवरण संरचना प्रकार का उपयोग करेंगे:
type intwrapper struct {
x int64
}
और अब हम कर सकते हैं:
instance6 := SomeType{
SomeField: &(&intwrapper{6}).x,
}
ध्यान दें कि यह
&(&intwrapper{6}).x
निम्नलिखित का अर्थ है:
& ( (&intwrapper{6}).x )
लेकिन हम "बाहरी" कोष्ठक को छोड़ सकते हैं &
क्योंकि चयनकर्ता अभिव्यक्ति चयनकर्ता के परिणाम पर लागू होता है ।
यह भी ध्यान दें कि पृष्ठभूमि में निम्नलिखित होगा (यह एक मान्य वाक्यविन्यास भी है):
&(*(&intwrapper{6})).x
7) सहायक गुमनाम संरचनात्मक शाब्दिक के साथ
केस # 6 के साथ सिद्धांत समान है, लेकिन हम एक अनाम संरचना शाब्दिक का भी उपयोग कर सकते हैं, इसलिए कोई सहायक / आवरण संरचना प्रकार की परिभाषा की आवश्यकता नहीं है:
instance7 := SomeType{
SomeField: &(&struct{ x int64 }{7}).x,
}