गो में पॉइंटर संशोधन, अंतर को समझना
गो में, किसी फ़ंक्शन में पॉइंटर पास करते समय, हम आमतौर पर मान को संशोधित करने का इरादा रखते हैं उस सूचक द्वारा इंगित किया गया। आमतौर पर, इसे डीरेफ़रेंसिंग के माध्यम से प्राप्त किया जा सकता है, जैसा कि निम्नलिखित कोड में दिखाया गया है:
type Test struct {
Value int
}
func main() {
i := Test{2}
p := &i
f(p)
println(i.Value) // Output: 4
}
func f(p *Test) {
*p = Test{4}
}
हालांकि, ऐसे उदाहरण हो सकते हैं जहां पारित सूचक द्वारा इंगित संरचना का मूल्य फ़ंक्शन के भीतर इसके संशोधन के बाद भी अपरिवर्तित रहता है। यह समझने के लिए कि ऐसा क्यों होता है, आइए एक संशोधित कोड स्निपेट की जांच करें:
type Test struct {
Value int
}
func main() {
i := Test{2}
p := &i
f(p)
println(i.Value) // Output: 2
}
func f(p *Test) {
// Attempt to modify the pointer value
p = &Test{4}
}
यह कोड स्निपेट सूचक मान p को संशोधित करने का प्रयास करता है, लेकिन मूल रूप से इंगित संरचना के मान को बदलने में विफल रहता है। इसका कारण यह है कि f() फ़ंक्शन के भीतर असाइनमेंट p = &Test{4} केवल स्थानीय चर p के मान को संशोधित करता है।
f() फ़ंक्शन के अंदर, p को स्थानीय चर के रूप में माना जाता है , और इसे एक नया मान निर्दिष्ट करने से मुख्य() फ़ंक्शन से पारित पॉइंटर के मान पर कोई प्रभाव नहीं पड़ता है। नतीजतन, पी द्वारा इंगित संरचना अपरिवर्तित रहती है, मुद्रित होने पर i.Value के अपरिवर्तित मूल्य में परिलक्षित होती है।
इसके विपरीत, निम्नलिखित कोड संरचना मूल्य को संशोधित करने के लिए सही दृष्टिकोण प्रदर्शित करता है:
type Test struct {
Value int
}
func main() {
i := Test{2}
p := &i
f(p)
println(i.Value) // Output: 4
}
func f(p *Test) {
p.Value = 4
}
इस कोड में, p.Value = 4 सीधे p द्वारा इंगित संरचना के वैल्यू फ़ील्ड को संशोधित करता है। इसके परिणामस्वरूप संरचना के मूल्य में वांछित संशोधन होता है, जो मुद्रित होने पर i.Value के अद्यतन मूल्य में परिलक्षित होता है।
यह ध्यान देने योग्य है कि पॉइंटर को एक नया मान निर्दिष्ट करना (जैसा कि p = &Test में है)। 4}) का अलग प्रभाव होता है. यह असाइनमेंट एक नई संरचना की ओर इशारा करने वाला एक नया सूचक बनाएगा, लेकिन मुख्य() फ़ंक्शन से पारित मूल सूचक द्वारा इंगित संरचना के मूल्य को प्रभावित नहीं करेगा।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3