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

## मैं पॉइंटर रिसीवर्स के साथ टाइप के इंस्टेंस को कॉपी क्यों नहीं कर सकता?

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

## Why Can\'t I Just Copy Instances of Types With Pointer Receivers in Go?

पॉइंटर रिसीवर्स को समझना और इंस्टेंस कॉपी करना

गो में, एक विधि को वैल्यू रिसीवर या पॉइंटर रिसीवर के साथ परिभाषित किया जा सकता है। जब प्रकार T की सभी विधियों में स्वयं T का एक रिसीवर प्रकार होता है, तो उस प्रकार के उदाहरणों की प्रतिलिपि बनाना सुरक्षित होता है, क्योंकि इसकी किसी भी विधि को कॉल करने से आवश्यक रूप से एक प्रतिलिपि बन जाती है।

हालाँकि, एक प्रकार होने पर स्थिति बदल जाती है इसमें पॉइंटर रिसीवर के साथ विधियाँ हैं। इस मामले में, उस प्रकार के उदाहरणों की प्रतिलिपि बनाने से बचा जाना चाहिए, क्योंकि यह आंतरिक अपरिवर्तनीयता का उल्लंघन कर सकता है। मुद्दा। मान लीजिए कि हमारे पास दो फ़ील्ड वाला एक प्रकार का रैपर है: एक मान v और एक पॉइंटर p। हम v और p के इंगित मान दोनों में समान संख्या संग्रहीत करने का इरादा रखते हैं। इसे सुनिश्चित करने के लिए, हम एक पॉइंटर रिसीवर के साथ एक सेट विधि प्रदान करते हैं:

टाइप रैपर स्ट्रक्चर { वी इंट पी *इंट } func (w *रैपर) सेट(v int) { डब्ल्यू.वी = वी *डब्ल्यू.पी = वी }

यदि हमारे पास रैपर का एक उदाहरण है और सेट विधि को कॉल करते हैं, तो यह पी के इंगित मूल्य को संशोधित करेगा। हालाँकि, यदि हम उदाहरण की प्रतिलिपि बनाते हैं, तो प्रतिलिपि मूल उदाहरण के समान सूचक मान p साझा करेगी। इसका मतलब यह है कि किसी भी उदाहरण पर किसी भी बाद की विधि कॉल दोनों प्रतियों को प्रभावित करेगी।

type Wrapper struct {
    v int
    p *int
}

func (w *Wrapper) Set(v int) {
    w.v = v
    *w.p = v
}

a := Wrapper{v: 0, p: new (इंट)} बी := ए fmt.Printf("a.v=%d, a.p=%d; b.v=%d, b.p=%d\n", a.v, *ap, b.v, *b.p) ए.सेट(1) fmt.Printf("a.v=%d, a.p=%d; b.v=%d, b.p=%d\n", a.v, *ap, b.v, *b.p)

आउटपुट:

a.v=0, a.p=0; बी.वी=0, बी.पी=0 ए.वी=1, ए.पी=1; b.v=0, b.p=1
a := Wrapper{v: 0, p: new(int)}
b := a

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)

ऐसे मुद्दों से बचने के लिए, पॉइंटर रिसीवर्स के साथ तरीकों का उपयोग करते समय पॉइंटर मानों के साथ काम करने की सिफारिश की जाती है। वैकल्पिक रूप से, यदि प्रकार में केवल मूल्य रिसीवर हो सकते हैं, तो विधि कॉल की परवाह किए बिना उस प्रकार के उदाहरणों की प्रतिलिपि बनाना सुरक्षित है।

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

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

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

Copyright© 2022 湘ICP备2022001581号-3