"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > परावर्तन का उपयोग करके स्ट्रक्चर फ़ील्ड मान सेट करते समय हमेशा गलत वापसी करने वाले सेटकैन () पर कैसे काबू पाएं?

परावर्तन का उपयोग करके स्ट्रक्चर फ़ील्ड मान सेट करते समय हमेशा गलत वापसी करने वाले सेटकैन () पर कैसे काबू पाएं?

2024-11-09 को प्रकाशित
ब्राउज़ करें:259

How to Overcome SetCan() Always Returning False When Setting Struct Field Values Using Reflection?

संरचनाओं के लिए सेटस्ट्रिंग के साथ प्रतिबिंब की खोज

प्रतिबिंब गो संरचनाओं को गतिशील रूप से हेरफेर करने के लिए शक्तिशाली उपकरण प्रदान करता है। इस उदाहरण में, प्रतिबिंब का उपयोग करके एक संरचना फ़ील्ड का मान सेट करने का प्रयास करते समय हमें एक सामान्य समस्या का सामना करना पड़ता है: CanSet() हमेशा गलत रिटर्न देता है। यह बाधा फ़ील्ड संशोधनों को रोकती है, जिससे हम असमंजस में पड़ जाते हैं। ]

पॉइंटर के बजाय एक मान पास करना:

मान द्वारा संरचनाओं को प्रतिबिंब के माध्यम से संशोधित नहीं किया जा सकता है। इसके बजाय, हमें संरचना में एक पॉइंटर पास करना होगा, यह सुनिश्चित करते हुए कि कोई भी परिवर्तन वास्तविक ऑब्जेक्ट पर लागू होता है।

गलत तत्व लक्ष्यीकरण:

कोड प्रारंभ में संपूर्ण प्रोडक्शनइन्फो संरचना पर काम करता है विशिष्ट प्रविष्टि जिसके फ़ील्ड1 मान को बदलने की आवश्यकता है। इसे सुधारने के लिए, हमें वांछित प्रवेश तत्व पर ध्यान केंद्रित करने की आवश्यकता है। &&&]

    func SetField(स्रोत इंटरफ़ेस{}, फ़ील्डनाम स्ट्रिंग, फ़ील्डवैल्यू स्ट्रिंग) { v := reform.ValueOf(source).Elem() // इंगित वस्तु का मूल्य प्राप्त करें fmt.Println(v.FieldByName(fieldName).CanSet()) यदि v.FieldByName(fieldName).CanSet() { v.FieldByName(fieldName).SetString(fieldValue) } }
  1. संशोधित SetField() फ़ंक्शन में, हम:
  2. पॉइंट ऑब्जेक्ट के मूल्य पर नेविगेट करने के लिए Elem() का उपयोग करते हैं, यह सुनिश्चित करते हुए कि हम वास्तविक संरचना पर काम करते हैं।जिस विशिष्ट फ़ील्ड को हम संशोधित करना चाहते हैं, उस तक पहुंचने के लिए फ़ील्डबायनेम() का उपयोग करें।

कोड इन करें क्रिया

इन संशोधनों के साथ, कोड अब फ़ील्ड1 मान को सफलतापूर्वक अपडेट करता है:

func SetField(source interface{}, fieldName string, fieldValue string) {
    v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
    fmt.Println(v.FieldByName(fieldName).CanSet())
    if v.FieldByName(fieldName).CanSet() {
        v.FieldByName(fieldName).SetString(fieldValue)
    }
}

आउटपुट:

    इससे पहले: {ए 2} सत्य इसके बाद: {NEW_VALUE 2}
  1. परिणाम एंट्री संरचना के भीतर फ़ील्ड1 के सफल संशोधन को दर्शाता है।
विज्ञप्ति वक्तव्य यह आलेख यहां पुनर्मुद्रित है: 1729662680 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.कॉम से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3