Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to copy a map?

Tags:

go

I'm trying to copy the contents of a map ( amap ) inside another one (aSuperMap) and then clear amap so that it can take new values on the next iteration/loop. The issue is that you can't clear the map without to clear its reference in the supermap as well. Here is some pseudo code.

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)  } 

I've also tried some dynamic stuff but obviously it throws an error (cannot assign to nil)

aSuperMap[y][x] = aData 

The question is how can I create an associative map ? In PHP I simply use aSuperMap[y][x] = aData. It seems that golang doesn't have any obvious method. If I delete delete(aMap, x) its reference from the super map is deleted as well. If I don't delete it the supermap ends up with duplicate data. Basically on each loop it gets aMap with the new value plus all the old values.

like image 762
The user with no hat Avatar asked Apr 14 '14 10:04

The user with no hat


People also ask

Can you copy a locator map?

For example, to clone a locator map, they will require another locator map that is empty. Only one clone can be created at a time. Once the player has the same type of map, they have to place the map that needs to be cloned in the first slot of the anvil and the empty map in the second slot.

Can you copy locked maps in Minecraft?

Maps can be locked when using a glass pane in a cartography table. This creates a new map containing the same data and locks it. All copies of this new map are also locked. A locked map never changes, even when the depicted terrain changes.


1 Answers

You are not copying the map, but the reference to the map. Your delete thus modifies the values in both your original map and the super map. To copy a map, you have to use a for loop like this:

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

Here's an example from the now-retired SO documentation:

// 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 } 

Excerpted from Maps - Copy a Map. The original author was JepZ. Attribution details can be found on the contributor page. The source is licenced under CC BY-SA 3.0 and may be found in the Documentation archive. Reference topic ID: 732 and example ID: 9834.

like image 92
Christian Avatar answered Sep 20 '22 06:09

Christian