2014-04-14 9 views
22

मैं एक मानचित्र (amap) की सामग्री को कॉपी करने की कोशिश कर रहा हूं (aSuperMap) और फिर amap साफ़ करें ताकि यह अगले पुनरावृत्ति/लूप पर नए मान ले सके। मुद्दा यह है कि आप सुपरमैप में मानचित्र without to clear its reference को भी साफ़ नहीं कर सकते हैं। यहां कुछ छद्म कोड है।मानचित्र की प्रतिलिपि कैसे करें?

for something := range fruits{ 
     aMap := make(map[string]aStruct) 
     aSuperMap := make(map[string]map[string]aStruct) 

     for x := range something{ 
      aMap[x] = aData 
      aSuperMap[y] = aMap 
      delete(aMap, x) 
    } 
//save aSuperMap 
    saveASuperMap(something) 

} 

मैं भी कुछ गतिशील सामान की कोशिश की है लेकिन स्पष्ट रूप से यह एक

aSuperMap[y][x] = aData 

त्रुटि (शून्य करने के लिए असाइन नहीं कर सकते) सवाल यह है कि मैं एक साहचर्य नक्शा बना सकते हैं फेंकता है? PHP में मैं बस एक सुपरपरमैप [वाई] [x] = aData का उपयोग करता हूं। ऐसा लगता है कि गोलांग में कोई स्पष्ट विधि नहीं है। यदि मैं delete(aMap, x) हटाता हूं तो सुपर मैप से इसका संदर्भ भी हटा दिया जाता है। अगर मैं इसे हटा नहीं देता तो सुपरमैप डुप्लिकेट डेटा के साथ समाप्त होता है। मूल रूप से प्रत्येक लूप पर यह aMap नए मूल्य के साथ सभी पुराने मानों के साथ मिलता है।

+0

गोलांग (golang.org)। टैग देखें :) –

उत्तर

44

आप मानचित्र की प्रतिलिपि नहीं बना रहे हैं, लेकिन मानचित्र के संदर्भ में हैं। आपका delete इस प्रकार आपके मूल मानचित्र और सुपर मानचित्र दोनों में मानों को संशोधित करता है। एक नक्शा कॉपी करने के लिए, तो आप इस तरह एक for पाश का उपयोग करना होगा:

for k,v := range originalMap { 
    newMap[k] = v 
} 

यहाँ अब सेवानिवृत्त अतः प्रलेखन से एक उदाहरण है:

// Create the original map 
originalMap := make(map[string]int) 
originalMap["one"] = 1 
originalMap["two"] = 2 

// Create the target map 
targetMap := make(map[string]int) 

// Copy from the original map to the target map 
for key, value := range originalMap { 
    targetMap[key] = value 
} 

Maps - Copy a Map के कुछ अंश। मूल लेखक JepZ था। एट्रिब्यूशन विवरण contributor page पर पाया जा सकता है। स्रोत CC BY-SA 3.0 के तहत लाइसेंस प्राप्त है और Documentation archive में पाया जा सकता है। संदर्भ विषय आईडी: 732 और उदाहरण आईडी: 9834.

+3

यह भी देखें [http://golang.org/doc/effective_go.html#maps ](http://golang.org/doc/effective_go.html#maps)। महत्वपूर्ण हिस्सा वास्तव में "अंतर्निहित डेटा संरचना का संदर्भ" है। यह स्लाइस पर भी लागू होता है। – seong

+1

धन्यवाद! हालांकि मैं इसका उपयोग करने के लिए (लूप के लिए) लेकिन मुझे डर था कि यह थोड़ी अधिक है और अभी भी ऐसा लगता है। –

+0

अभी भी ऐसा लगता है कि मैं मंडलियों में आगे बढ़ रहा हूं। मुझे लगता है कि नया नक्शा नया मैप [के] अधिभारित हो जाएगा, इसलिए मैं सुपर लूप से मूल्यों को खोले बिना इसे अगले लूप पर भी खाली नहीं कर सकता। –

1

व्यक्तिगत तत्व प्रतिलिपि, यह मेरे लिए एक साधारण उदाहरण के साथ काम करता प्रतीत होता है।

maps := map[string]int { 
    "alice":12, 
    "jimmy":15, 
} 

maps2 := make(map[string]int) 
for k2,v2 := range maps { 
    maps2[k2] = v2 
} 

maps2["miki"]=rand.Intn(100) 

fmt.Println("maps: ",maps," vs. ","maps2: ",maps2) 
संबंधित मुद्दे