प्रतिबिंब का उपयोग करके नेस्टेड संरचनाओं में फ़ील्ड पते प्राप्त करना
इस परिदृश्य में, आप नेस्टेड संरचनाओं को पार करना और जांचना चाहते हैं और गैर के पते प्राप्त करना चाहते हैं -उनके भीतर सूचक फ़ील्ड। प्रतिबिंब का उपयोग करते हुए, आपके पास एक फ़ंक्शन है जो फ़ील्ड के माध्यम से पुनरावृत्त होता है लेकिन एम्बेडेड सबस्ट्रक्चर में स्थित गैर-पॉइंटर फ़ील्ड के मेमोरी पते को प्राप्त करने में कठिनाइयों का सामना करता है।
इस समस्या को सुधारने के लिए, यह ध्यान रखना महत्वपूर्ण है कि valueField.Interface() करता है अपेक्षित परिणाम प्रदान नहीं करता क्योंकि यह फ़ील्ड के भीतर संग्रहीत वास्तविक मान लौटाता है, जो गैर-सूचक प्रकारों के साथ काम करते समय मान्य नहीं है।
समाधान एक प्रतिबिंबित प्राप्त करने के लिए InspectStructV फ़ंक्शन को संशोधित करने में निहित है। एक इंटरफ़ेस{}. यह आपको सीधे प्रतिबिंब वस्तु में हेरफेर करने और फ़ील्ड का पता पुनः प्राप्त करने की अनुमति देता है। इसके अतिरिक्त, जब स्ट्रक्चर फ़ील्ड के लिए InspectStructV को पुनरावर्ती रूप से कॉल किया जाता है, तो वैल्यूफ़ील्ड, जो पहले इंटरफ़ेस मान रखता था, अब सीधे नेस्टेड संरचना के लिए प्रतिबिंब मान को इंगित करता है, यह सुनिश्चित करता है कि पता सही ढंग से पुनर्प्राप्त किया जा सकता है।
यहां संशोधित कोड है स्निपेट:
func InspectStructV(val reflect.Value) {
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for i := 0; i ये परिवर्तन करके, आप गैर-पॉइंटर फ़ील्ड के मेमोरी पते को सफलतापूर्वक पुनर्प्राप्त करने में सक्षम होंगे, भले ही वे नेस्टेड संरचनाओं के भीतर रहते हों।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3