如何在golang中创建关联映射?

时间:2014-04-14 16:09:11

标签: arrays go

我正试图创建一个“联想”组合。地图。问题是superMap收集了aMap的所有值。 基本上即使我想在每个外观上只存储一个amap实例,我最终会存储当前实例加上所有之前的循环。 supermap[value] = amap[value]。但是,下面的代码段会存储supermap[value] = amap。原因是我无法找到解决此问题的方法。如果我在每次循环后删除aMap的旧值,它们也会从supermap中删除。

  package main

    import (
    "fmt"
)

func main() {

    aData := map[int]string{
        0: "apple",
        1: "samsung",
        2: "htc",
        3: "sony",
    }

    dir := []string{"user", "doc", "bin", "src"}

    aMap := make(map[int]string)
    superMap := make(map[string]map[int]string)

    for k, v := range dir {
        aMap[k] = aData[k]
        superMap[v] = aMap


    }
    hello(superMap)

}

func hello(superMap map[string]map[int]string) {
    fmt.Printf("superMap of user is %v \n", superMap["user"])

    cnt := len(superMap["user"])
    if cnt > 1{


    fmt.Printf("expected only one value received %v", cnt)
    }
}

Play

1 个答案:

答案 0 :(得分:2)

正如Arjan在评论中所说,你需要将aMap的创建移动到for循环中。原因是,在您发布的原始代码中,您正在处理内存中aMap的一个实例。这意味着,只创建了一个名为aMap的地图,当您将另一个变量分配给值aMap时,您分配了一个参考。这意味着,任何包含状态变异的引用(到aMap)的变量都会在包含引用的所有其他变量中被观察到,因为它们都会解析为内存中的同一个对象。

aMap移入for / range循环时,这意味着将创建4个aMap个体实例,并且都有自己的内存。改变其中一个aMaps的状态不会影响其他人,因为它们是记忆中自己的对象。现在,如果您使用其中一个对象并使用另一个变量再次引用它,那么您最终将与第一个案例在同一条船上。

package main

import (
    "fmt"
)

func main() {

    aData := map[int]string{
        0: "apple",
        1: "samsung",
        2: "htc",
        3: "sony",
    }

    dir := []string{"user", "doc", "bin", "src"}

    //aMap := make(map[int]string) //only one map instance is created in memory
    superMap := make(map[string]map[int]string)

    for k, v := range dir {
        //multiple map instances are created in memory
        aMap := make(map[int]string)
        aMap[k] = aData[k]
        superMap[v] = aMap

    }

    hello(superMap)
}

func hello(superMap map[string]map[int]string) {
    fmt.Printf("superMap of user is %v \n", superMap["user"])
    cnt := len(superMap["user"])

    if cnt > 1 {
        fmt.Printf("expected only one value received %v", cnt)
    }
}