Go多维map赋值

Go的map对标C++中的unordered_map<T1,T2>(底层hash),在Go中目前并没有类似C++STL中的map<T1,T2>(底层红黑树)。在使用多维map时,遇到一个坑…

问题

在C++中,一个二维unordered_map赋值可以用下面方法

1
2
3
unordered_map<string, unordered_map<string, int>> testMap;
testMap["key1"]["key2"] = 1;
testMap["key1"]["key3"] = 2;

在Go中,想用类似方式进行赋初值

1
2
3
testMap := map[string]map[string]int{}	// 这里要初始化
testMap["key1"]["key2"] = 1	// 这里会报错,因为第二维的map并没有创建
testMap["key1"]["key3"] = 2	// 这里会报错,因为第二维的map并没有创建

改进一下赋值方式

1
2
3
4
5
6
testMap := map[string]map[string]int{}

testMap["key1"] = map[string]int{"key2" : 1}

testMap["key1"] = map[string]int{"key3" : 2}
// 结果第二次赋值把第一次结果覆盖了

分析

Go中map的使用更像是java中对象的用法,变量其实是一个指针,随时需要考虑指针是否为空。而C++中由于对象直接在栈中被自动创建了,所以可以直接使用。

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
testMap := map[string]map[string]int{}
...
if _,exist := testMap["key1"]; exist {
    testMap["key1"]["key2"] = 1
}else{
	testMap["key1"] = map[string]int{"key2" : 1}
}
...
if _,exist := testMap["key1"]; exist {
    testMap["key1"]["key3"] = 2
}else{
	testMap["key1"] = map[string]int{"key3" : 2}
}