2016-07-18 10 views
5

जब हम (* structObj) का उपयोग करके संरचना का संदर्भ देते हैं, तो गोलांग मूल संरचना ओबीजे के समान पते को वापस करने के बजाय structObj की एक नई प्रति वापस लौटने लगते हैं? इस पर मेरा कुछ गलत हो सकता है, बहुत दयालु स्पष्टीकरण मांगdereference गोलांग संरचना संरचना की नई प्रति वापसी है?

package main 

import (
    "fmt" 
) 

type me struct { 
    color string 
    total int 
} 

func study() *me { 
    p := me{} 
    p.color = "tomato" 
    fmt.Printf("%p\n", &p.color) 
    return &p 
} 

func main() { 


    p := study() 
    fmt.Printf("&p.color = %p\n", &p.color) 

    obj := *p 
    fmt.Printf("&obj.color = %p\n", &obj.color) 
    fmt.Printf("obj = %+v\n", obj) 

    p.color = "purple" 
    fmt.Printf("p.color = %p\n", &p.color) 
    fmt.Printf("p = %+v\n", p) 
    fmt.Printf("obj = %+v\n", obj) 

    obj2 := *p 
    fmt.Printf("obj2 = %+v\n", obj2) 
} 

आउटपुट

0x10434120 
&p.color = 0x10434120 
&obj.color = 0x10434140 //different than &p.color! 
obj = {color:tomato total:0} 
p.color = 0x10434120 
p = &{color:purple total:0} 
obj = {color:tomato total:0} 
obj2 = {color:purple total:0} // we get purple now when dereference again 

golang playground

उत्तर

2

जब आप लिखना

obj := *p 

आप struct का मूल्य कॉपी कर रहे हैं p द्वारा इंगित (* dereferences p)। यह इसी तरह की है करने के लिए:

var obj me = *p 

तो obj प्रकार me का एक नया चर, *p के मूल्य के प्रारंभ की जा रही है। यह एक अलग स्मृति पता रखने के लिए obj का कारण बनता है।

ध्यान दें कि obj प्रकार me की है, p प्रकार *me की है, जबकि। लेकिन वे अलग मूल्य हैं। obj के क्षेत्र का मान बदलना p में उस फ़ील्ड के मान को प्रभावित नहीं करेगा (जब तक me संरचना में फ़ील्ड, यानी स्लाइस, मानचित्र या चैनल के रूप में संदर्भ संदर्भ नहीं है। here और here देखें।)। आपको लगता है कि प्रभाव के बारे में लाने के लिए चाहते हैं, का उपयोग करें: p रूप में एक ही वस्तु के लिए

obj := p 
// equivalent to: var obj *me = p 

अब obj अंक। उनके पास अभी भी अलग-अलग पते हैं, लेकिन उनके भीतर वास्तविक me ऑब्जेक्ट का एक ही पता रखें।

+0

क्या एक ही dereferenced सूचक को पी करने के लिए एक तरीका है? जैसा कि मुख्य() func में है, अगर हम एक स्लाइस के रूप में संरचना को जोड़ रहे हैं, तो हमें हमेशा इसे जोड़ने के अंदर इसे अव्यवस्थित करना होगा, यानी res = append (res, * p)। – ken

+0

यह सिर्फ एक नया चर बनाने "बनाने" के बारे में नहीं है, एक मौजूदा चर के लिए असाइनमेंट एक dereference प्रतियों के माध्यम से मूल्य, उदाहरण के लिए '* ए = * बी' ने अभी भी प्रतियां * * बी' को' * ए' में प्रतिलिपि बनाई है। – JimB

+0

@jimB याप, दोहराई गई प्रतिलिपि से बचने का कोई तरीका है? मूल रूप से ऑपरेशन को केवल उसी पी संरचना से निपटने की आवश्यकता होती है। – ken

6

नहीं, "असाइनमेंट" हमेशा गो में एक प्रति बनाता है, जिसमें फ़ंक्शन और विधि तर्कों के असाइनमेंट शामिल हैं। बयान obj := *p*p से obj का मान प्रतिलिपि बनाता है।

आप बयान p.color = "purple"(*p).color = "purple" करने के लिए आप एक ही आउटपुट मिल जाएगा बदलते हैं, क्योंकि अपसंदर्भन p अपने आप में एक प्रतिलिपि नहीं बनाता है।

+0

वास्तव में, सी पृष्ठभूमि से आ रहा है, यह मुझे भ्रमित कर देता है। धन्यवाद, सोचें कि दोनों जवाब सही हैं और एक ही समय में मेरे पास पहुंचते हैं, इसलिए अधिक जानकारी चुनें, लेकिन अपने उत्तर के लिए भी इसे ऊपर उठाएं! – ken

+0

'dereferencing पी स्वयं एक प्रतिलिपि नहीं बनाता है' यह मेरे भ्रम को स्पष्ट करता है, धन्यवाद – stackoverflower

संबंधित मुद्दे