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

## जब विधियों में पॉइंटर रिसीवर हों तो मुझे गो में इंस्टेंस की प्रतिलिपि बनाने से कब बचना चाहिए?

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

## When should I avoid copying instances in Go when methods have pointer receivers?

इंस्टेंस कॉपी करते समय पॉइंटर रिसीवर का महत्व

डेटा में हेरफेर करते समय, संदर्भ या मूल्य द्वारा मूल्यों को पारित करने की बारीकियों को समझना महत्वपूर्ण है। गो में, विधियों को मूल्य या सूचक रिसीवर के साथ परिभाषित किया जा सकता है, और इस विकल्प के निहितार्थ को समझना आवश्यक है, खासकर उदाहरणों की प्रतिलिपि बनाते समय।

मूल्य रिसीवर

मूल्य प्राप्तकर्ताओं वाली विधियाँ उन्हें प्राप्त मूल्य की एक प्रति पर काम करती हैं। विधि के अंतर्गत किया गया कोई भी संशोधन मूल मूल्य को प्रभावित नहीं करेगा। यह सुनिश्चित करता है कि कॉपी किए गए उदाहरणों पर कॉलिंग विधियां मूल डेटा से समझौता नहीं करेंगी। . ऐसे तरीकों में डेटा को बदलने की क्षमता होती है, जिससे सूक्ष्म और अनपेक्षित दुष्प्रभाव हो सकते हैं। पॉइंटर रिसीवर के साथ उदाहरणों की प्रतिलिपि बनाने से मूल और कॉपी किए गए डेटा के बीच विसंगतियां उत्पन्न होने का जोखिम होता है।

उदाहरण: रैपर संरचना

समस्या को स्पष्ट करने के लिए, रैपर नामक एक प्रकार पर विचार करें फ़ील्ड v (मान) और p (मान के लिए सूचक) के साथ:

टाइप रैपर स्ट्रक्चर { वी इंट पी *इंट }

पॉइंटर रिसीवर के साथ सेट() विधि वी और इंगित मूल्य दोनों को संशोधित करती है:

type Wrapper struct {
    v int
    p *int
}
मान लीजिए हमारे पास एक रैपर उदाहरण है a:

func (w *Wrapper) Set(v int) {
    w.v = v
    *w.p = v
}
कॉलिंग सेट() a पर v और *p दोनों को संशोधित किया जाएगा:

a := Wrapper{v: 0, p: new(int)}
अब, यदि हम b बनाने के लिए a की प्रतिलिपि बनाते हैं, तो हम उम्मीद करते हैं कि दोनों उदाहरणों में सुसंगत मान होंगे :

a.Set(1)
हालाँकि, Set() का उपयोग करने वाले बाद के संशोधन सूचक पी की प्रतिलिपि बनाने के कारण b में प्रसारित नहीं होंगे, जिसके परिणामस्वरूप असंगत डेटा होगा:

b := a
आउटपुट:

a.v=0, a.p=0; बी.वी=0, बी.पी=0 ए.वी=1, ए.पी=1; b.v=0, b.p=1
fmt.Printf("a.v=%d, a.p=%d;  b.v=%d, b.p=%d\n", a.v, *a.p, b.v, *b.p)
a.Set(1)
fmt.Printf("a.v=%d, a.p=%d;  b.v=%d, b.p=%d\n", a.v, *a.p, b.v, *b.p)
निष्कर्ष

a.v=0, a.p=0;  b.v=0, b.p=0
a.v=1, a.p=1;  b.v=0, b.p=1
नवीनतम ट्यूटोरियल अधिक>

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

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

Copyright© 2022 湘ICP备2022001581号-3