// 先声明map
var m1 map[string]string
// 再使用make函数创建一个非nil的map,nil map不能赋值
m1 = make(map[string]string)
// 最后给已声明的map赋值
m1["a"] = "aa"
m1["b"] = "bb"
// 直接创建
m2 := make(map[string]string)
// 然后赋值
m2["a"] = "aa"
m2["b"] = "bb"
// 初始化 + 赋值一体化
m3 := map[string]string{
"a": "aa",
"b": "bb",
}
// ==========================================
// 查找键值是否存在
if v, ok := m1["a"]; ok {
fmt.Println(v)
} else {
fmt.Println("Key Not Found")
}
// 遍历map
for k, v := range m1 {
fmt.Println(k, v)
}
map赋值前要先初始化:assignment to entry in nil map
注意这种map的嵌套的形式,make只初始化了map[string]T部分(T为map[int]int),所以下面的赋值会出现错误:
test := make(map[string]map[int]int)
test["go"][0] = 0 // error
正确的做法:
test := make(map[string]map[int]int)
test["go"] = make(map[int]int)
test["go"][0] = 0
一个常用的做法:
test := make(map[string]map[int]int)
if test["go"] = nil {
test["go"] = make(map[int]int)
}
test["go"][0] = 0
补充:
-
map
数据类型初始化:两种方式:
map[string]string{}
或make(map[string]string)
-
未初始化的
map
是nil
:未初始化的
map
是nil
,它与一个空map
基本等价,只是nil
的map
不允许往里面添加值。(A nil map is equivalent to an empty map except that no elements may be added)
因此,map
是nil
时,取值是不会报错的(取不到而已),但增加值会报错。
其实,还有一个区别,delete
一个nil map
会panic
,但是delete
空map
是一个空操作(并不会panic
)(这个区别在最新的Go tips
中已经没有了,即:delete
一个nil map
也不会panic
) -
通过
fmt
打印map
时,空map
和nil map
结果是一样的:通过
fmt
打印map
时,空map
和nil map
结果是一样的,都为map[]
。所以,这个时候别断定map
是空还是nil
,而应该通过map == nil
来判断。
Request
中的Form
字段就是如此,在没有直接或间接调用ParseForm()
时,Form
其实是nil
,但是,你如果println
出来,却是map[]
,可能有些困惑。通过跟踪源码可以发现,Form
根本没有初始化。而在FormValue()
方法中会判断Form
是否为nil
,然后决定是否调用ParseForm()
方法,当然,你也可以手动调用ParseForm()
方法。