我正试图创建一个“联想”组合。地图。问题是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)
}
}
答案 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)
}
}