गो

2015-12-30 6 views
6

में फ़ंक्शन को पॉइंटर्स पास करके अलग-अलग मान प्राप्त करना कहें कि मैं एक फ़ंक्शन में पॉइंटर पास करना चाहता हूं और उस संरचना के मान को बदलना चाहता हूं जो कि पॉइंटर ऐसा करने से इंगित करता है। मैं सामान्य रूप से सूचक dereferencing कर ऐसा कर होगा:गो

type Test struct { Value int} 
func main() { 
    var i Test = Test {2} 
    var p *Test = &i 
    f(p) 
    println(i.Value) // 4 
} 
func f(p *Test) { 
    *p = Test{4} 
} 

मेरा प्रश्न है, यही कारण है कि इस कोड को मूल्य

type Test struct { Value int} 
func main() { 
    var i Test = Test {2} 
    var p *Test = &i 
    f(p) 
    println(i.Value) // 2 
} 
func f(p *Test) { 
    // ? 
    p = &Test{4} 
} 

परिवर्तन नहीं करता है, जबकि यह एक करता है:

type Test struct { Value int} 
func main() { 
    var i Test = Test {2} 
    var p *Test = &i 
    f(p) 
    println(i.Value) // 4 
} 
func f(p *Test) { 
    p.Value = 4 
} 

उत्तर

13

क्योंकि यह लाइन:

p = &Test{4} 

बस p चर के लिए एक नया सूचक मूल्य असाइन करता है। f() फ़ंक्शन के अंदर, p केवल एक स्थानीय चर है। p पर कोई नया मान निर्दिष्ट करके, आप केवल स्थानीय चर के मूल्य को बदल रहे हैं और पर ध्यान केंद्रित मूल्य नहीं है।

pf() में स्थानीय चर pmain() में स्थानीय चर के साथ कुछ लेना देना नहीं है। यदि आप f() में बदलते हैं, तोमें p नहीं बदलेगा (और यह न कि दिशात्मक संरचना मूल्य को भी बदलेगा)।

अपने दूसरे उदाहरण में:

(*p).Value = 4 

यह बदलता है बताया मूल्य, इसलिए आप परिवर्तन जब f() रिटर्न का पालन करेंगे:

p.Value = 4 

यह के लिए एक आशुलिपि है।

नोट:

बस एक पक्ष नोट के रूप में, यदि आपका main() समारोह में आप f() कार्य करने के लिए (main() है जो एक सूचक में स्थानीय चर) p का पता मिलेगा, इसलिये आप पते को संशोधित कर सकता है मुख्य के p में संग्रहीत:

func f(p **Test) { 
    *p = &Test{4} 
} 

और main() से, यह पसंद फोन:

var i Test = Test{2} 
var p *Test = &i 
f(&p) 
println(i.Value) // 2 - Note that 'i' won't change! 
println(p.Value) // 4 - Only the address in 'p' to the new struct value created in f() 

लेकिन जाहिर है कि एक सूचक *Test गुजर रहा है और बिंदु मूल्य (p.Value = 4) को संशोधित करना अधिक कुशल, अधिक सुविधाजनक और अधिक क्लीनर है।