map初始化定义
go
package main
import "fmt"
func main() {
//标准定义
var nameMap map[string]string = map[string]string{
"1": "张三",
"2": "李四",
"3": "王五",
}
fmt.Println(nameMap) //map[1:张三 2:李四 3:王五]
//声明并赋值
var nameMap1 = map[string]string{}
fmt.Println(nameMap1) //map[]
//简短声明
nameMap2 := map[string]string{}
fmt.Println(nameMap2) //map[]
//make函数初始化
nameMap3 := make(map[string]string)
fmt.Println(nameMap3)//map[]
}
注意:go语言中map定义时必须初始化!!!否则后续使用会报错!!!
go
var nameMap4 map[string]string
nameMap4["name"] = "123" //报错panic: assignment to entry in nil map
fmt.Println(nameMap4)
-
这只声明了一个map变量,但没有初始化
-
此时
aMap的值是nil(零值) -
向
nil的map赋值会导致运行时panic
这里简单提一嘴,go语言中map底层的数据结构是哈希表。
map取值
直接使用[]就可获取对于key的value
go
var nameMap map[string]string = map[string]string{
"1": "张三",
"2": "李四",
"3": "王五",
}
fmt.Println(nameMap) //map[1:张三 2:李四 3:王五]
fmt.Println(nameMap["2"])//李四
如果访问一个不存在的key会怎么样?
go
var nameMap map[string]string = map[string]string{
"1": "张三",
"2": "李四",
"3": "王五",
}
fmt.Println(nameMap) //map[1:张三 2:李四 3:王五]
fmt.Println(nameMap["2"]) //李四
fmt.Printf("%#v\n", nameMap["4"]) //""
注意:当访问一个不存在的key时是不会像C++一样往里面插入的。
那如果我的map里面本来就有一个key对于的value是空字符串该如何区分呢?
go
var nameMap map[string]string = map[string]string{
"1": "张三",
"2": "李四",
"3": "王五",
"4": "",
}
tmp1, ok1 := nameMap["4"]
fmt.Printf("%#v\n", tmp1) //""
fmt.Println(ok1) //true
tmp2, ok2 := nameMap["5"]
fmt.Printf("%#v\n", tmp2) //""
fmt.Println(ok2) //false
如上所示,map的[]是有两个返回值的,第一个返回值会返回对于key的value,第二个会返回这个key是否存在的bool值。