2015-12-10 4 views
6

ठीक है यह शब्दों में वर्णन लेकिन मान लीजिए कि मैं एक ऐसा नक्शा int संकेत संग्रहीत करता है, और मेरी हैश में एक और कुंजी के रूप में एक ऑपरेशन का परिणाम संग्रहीत करना चाहते हैं करना मुश्किल है cannot take the address of *m["x"] & *m["y"]मैं जाओ में एक ऑपरेशन का परिणाम के संदर्भ में कैसे जमा कर सकते हैं?</p> <pre><code>m := make(map[string]*int) m["d"] = &(*m["x"] + *m["y"]) </code></pre> <p>यह काम नहीं करता:

विचार: और मुझे त्रुटि देता है?

+0

ऐसी बात स्टोर करने के लिए क्यों चाहते हैं हैं? 'एम [" डी "] = एम [" एक्स "] + एम [" वाई "]' ऑपरेशन के परिणाम स्टोर करता है – fabrizioM

उत्तर

10

एक सूचक एक स्मृति पता है। उदाहरण के लिए एक चर में स्मृति में एक पता है।

3 + 4 की तरह एक ऑपरेशन का परिणाम है क्योंकि कोई विशेष स्मृति इसके लिए आवंटित है वहाँ एक पता नहीं है। परिणाम प्रोसेसर रजिस्टरों में बस रह सकता है।

आप स्मृति जिसका पता आप नक्शे में डाल सकते हैं आवंटित करने के लिए किया है। सबसे आसान और सबसे सरल इसके लिए एक स्थानीय चर बनाने के लिए है।

x, y := 1, 2 
m := map[string]*int{"x": &x, "y": &y} 

d := *m["x"] + *m["y"] 
m["d"] = &d 

fmt.Println(m["d"], *m["d"]) 

आउटपुट (Go Playground पर यह कोशिश):

इस उदाहरण देखें

0x10438300 3 

नोट: कोड के ऊपर एक समारोह, स्थानीय चर का पता में है, तो (d) कि अगर हम फ़ंक्शन से वापस लौटते हैं तो भी हम मानचित्र में डालते रहेंगे (यानी map वापस या बनाया गया है - उदाहरण के लिए एक वैश्विक चर)। जाओ में स्थानीय चर के पते को लेने और वापस करने के लिए यह पूरी तरह से सुरक्षित है। कंपाइलर कोड का विश्लेषण करेगा और यदि पता (सूचक) फ़ंक्शन से बच निकलता है, तो यह स्वचालित रूप से ढेर (और ढेर पर नहीं) पर आवंटित किया जाएगा। विवरण देखने के लिए FAQ: How do I know whether a variable is allocated on the heap or the stack?

नोट # 2: अन्य तरीके एक मूल्य (इस उत्तर में दिए गए विवरण के रूप में: How do I do a literal *int64 in Go?) के लिए सूचक बनाने के लिए हैं, लेकिन वे सिर्फ "चाल" कर रहे हैं और अच्छे नहीं या अधिक कुशल हैं। स्थानीय चर का उपयोग करना सबसे साफ और अनुशंसित तरीका है।

उदाहरण के लिए यह भी एक स्थानीय चर बनाने के बिना काम करता है, लेकिन यह स्पष्ट रूप से बिल्कुल सहज नहीं है:

m["d"] = &[]int{*m["x"] + *m["y"]}[0] 

आउटपुट में ही है। इसे Go Playground पर आज़माएं।

0

अतिरिक्त परिणाम कहीं भी क्षणिक (ढेर पर) रखा गया है और इसलिए यह अपना पता लेने के लिए सुरक्षित नहीं होगा।

result := make(int) 
*result = *m["x"] + *m["y"] 
m["d"] = result 
0

जाओ में, आप एक शाब्दिक मूल्य (औपचारिक रूप से एक आर-मूल्य के रूप में जाना जाता है) के संदर्भ नहीं ले सकते: आप स्पष्ट रूप से ढेर पर एक int आवंटन द्वारा इस के आसपास काम करने के लिए अपने परिणाम धारण करने के लिए सक्षम होना चाहिए । Try निम्नलिखित:

package main 

import "fmt" 

func main() { 

    x := 3; 
    y := 2; 
    m := make(map[string]*int) 

    m["x"] = &x 
    m["y"] = &y 

    f := *m["x"] + *m["y"] 
    m["d"] = &f 

    fmt.Printf("Result: %d\n",*m["d"]) 
} 

this ट्यूटोरियल पर एक नज़र डालें।

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