रिफ्लेक्ट क्यों। मेकस्लाइस अन-एड्रेसेबल वैल्यू लौटाता है
गो में, रिफ्लेक्ट पैकेज प्रकारों और मूल्यों का निरीक्षण और हेरफेर करने के लिए एक इंटरफ़ेस प्रदान करता है। प्रतिबिंबित.मेकस्लाइस किसी दिए गए प्रकार का एक स्लाइस बनाता है। हालाँकि, लौटाया गया मान पता योग्य नहीं है। इसका मतलब यह है कि आप इसका पता नहीं ले सकते हैं या इसे किसी पॉइंटर को असाइन नहीं कर सकते हैं। स्लाइस के लिए पॉइंटर बनाने के लिए रिफ्लेक्ट.न्यू() फ़ंक्शन का उपयोग कर सकते हैं। इसे इस प्रकार किया जा सकता है:
// स्लाइस प्रकार बनाएं स्लाइसटाइप := प्रतिबिंबित.स्लाइसऑफ(कुछ प्रकार) // रिफ्लेक्ट.मेकस्लाइस का उपयोग करके एक स्लाइस बनाएं स्लाइस := प्रतिबिंबित करें। मेकस्लाइस (स्लाइस टाइप, 10, 10) // स्लाइस के लिए एक पॉइंटर बनाएं स्लाइसपीटीआर := प्रतिबिंबित.नया(स्लाइस.टाइप()) // स्लाइस पॉइंटर को स्लाइस पर सेट करें स्लाइसPtr.Elem().Set(slice)अब, आपके पास एक पता योग्य स्लाइस है जिसे उन कार्यों के तर्क के रूप में पारित किया जा सकता है जिनके लिए स्लाइस पॉइंटर की आवश्यकता होती है।
क्यों प्रतिबिंबित करें। मेकस्लाइस रिटर्न्स अन-एड्रेसेबल वैल्यू// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
गो में स्थानीय स्टैक वैरिएबल एड्रेसेबल नहीं हैं क्योंकि रनटाइम उन्हें किसी भी समय ढेर में ले जा सकता है समय। प्रतिबिंबित.मेकस्लाइस एक स्थानीय स्लाइस वैरिएबल बनाता है, यही कारण है कि लौटाया गया मान अन-एड्रेसेबल है।
स्लाइस के लिए पॉइंटर की आवश्यकता क्यों है
कुछ एपीआई, जैसे जैसा कि आपने एमजीओ पैकेज से उल्लेख किया है, तर्क के रूप में एक स्लाइस के लिए एक पॉइंटर की आवश्यकता होती है। ऐसा इसलिए है क्योंकि स्लाइस को जोड़ने पर, बढ़ी हुई क्षमता वाला एक नया स्लाइस आवंटित किया जा सकता है। यदि आप एक गैर-पॉइंटर स्लाइस पास करते हैं, तो स्लाइस में किए गए परिवर्तन फ़ंक्शन के बाहर दिखाई नहीं देंगे।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3