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

## स्कोपलिंट त्रुटि: रेंज स्कोप पर वेरिएबल का उपयोग करना - फ़ंक्शन लिटरल्स में लूप वेरिएबल्स को सुरक्षित रूप से कैसे संदर्भित करें?

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

## Scopelint Error: Using Variable on Range Scope - How to Safely Refer to Loop Variables in Function Literals?

स्कोपलिंट त्रुटि: रेंज स्कोप पर वेरिएबल का उपयोग करना

एक परीक्षण फ़ंक्शन TestGetUID में, कोड को स्कोपलिंट द्वारा रिपोर्ट की गई एक त्रुटि का सामना करना पड़ता है, जो इसके खिलाफ चेतावनी देता है फ़ंक्शन शाब्दिक के भीतर रेंज स्कोप से वेरिएबल x का उपयोग करना। t.Run(x.description, func(t *testing.T) { क्लाइंट := नकली.न्यूसिंपलक्लाइंटसेट(x.objs...) वास्तविक := getUID(क्लाइंट, x.namespace) ज़ोर.समान(t, x.अपेक्षित, वास्तविक) }) }

त्रुटि इन पंक्तियों से संबंधित है क्योंकि x परीक्षण स्लाइस पर पुनरावृत्त होने वाले रेंज लूप के भीतर लूप वैरिएबल है। स्कोपलिंट पता लगाता है कि x का उपयोग t.Run() को दिए गए फ़ंक्शन अक्षरशः में किया जा रहा है, जिससे t.Run() वापस आने के बाद फ़ंक्शन अक्षरशः लागू होने पर संभावित समस्याएं हो सकती हैं।

for _, x := range tests {
    t.Run(x.description, func(t *testing.T) {
        client := fake.NewSimpleClientset(x.objs...)
        actual := getUID(client, x.namespace)
        assert.Equal(t, x.expected, actual)
    })
}

समस्या इसलिए उत्पन्न होती है क्योंकि कंपाइलर यह गारंटी नहीं दे सकता है कि t.Run() को बनाए और पास किए गए फ़ंक्शन अक्षर t.Run() से बाहर निकलने के बाद कॉल नहीं किए जाएंगे। यदि फ़ंक्शन अक्षर को t.Run() रिटर्न के बाद बुलाया गया था, तो वे x वैरिएबल को संदर्भित करेंगे, जो लूप के बाद के पुनरावृत्ति से मूल्य के साथ ओवरराइट किया गया हो सकता है।

गो पशु चिकित्सक इस चेतावनी को बढ़ाता है ऐसे अनपेक्षित व्यवहार को रोकें, जिसके परिणामस्वरूप बग या यहां तक ​​कि डेटा रेस भी हो सकती है यदि फ़ंक्शन अक्षर अलग-अलग गोरआउट्स में समवर्ती रूप से निष्पादित होते हैं।

ऐसे मामलों में अनुशंसित सर्वोत्तम अभ्यास या तो

मान को पास करना है

लूप वेरिएबल को फ़ंक्शन लिटरल में एक तर्क के रूप में जोड़ें या

लूप वेरिएबल की एक कॉपी बनाएं

और फ़ंक्शन लिटरल के भीतर कॉपी को देखें। चूंकि फ़ंक्शन शाब्दिक के हस्ताक्षर को बदला नहीं जा सकता है, इसलिए अनुशंसित समाधान एक प्रतिलिपि बनाना है, उदाहरण के लिए:

x2 := xइस प्रतिलिपि को घोषित करने के बाद, x पहचानकर्ता फ़ंक्शन शाब्दिक स्थानीय प्रतिलिपि को संदर्भित करेगा, लूप वेरिएबल को नहीं। हालाँकि कॉपी को एक ही नाम देना भ्रमित करने वाला लग सकता है, लेकिन यह कॉपी का उपयोग करने के इरादे को स्पष्ट रूप से इंगित करता है।

नवीनतम ट्यूटोरियल अधिक>

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

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

Copyright© 2022 湘ICP备2022001581号-3