map是key-value数据结构,又称为字段或者关联数组。类似其他编程语言中的集合,在编程中是经常使用到。
map的声明:
基本语法:
var map变量名 map[keytype]valuetype
key 可以是什么类型?
golang中的map,的key 可以是很多种类型,比如 bool,数字,string,指针,channel,还可以是只包含前面几个类型的 接口,结构体,数组
通常为int、string
注意:slice,map还有 function 不可以,因为这几个没法用==来判断
valuetype 可以是什么类型?
valuetype 的类型和key 基本一样
通常为:数字(整数,浮点数),string,map,struct
map声明的举例:
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string
注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。
func main() {
//map的声明和注意事项
var a map[string]string
//在使用map前需要先make,make的作用就是给map分配数据空间
a = make(map[string]string, 10)
a["no1"] = "宋江"
a["no2"] = "吴用"
a["no1"] = "武松"
a["no3"] = "吴用"
fmt.Println(a)
}
对上面代码的说明:
1)map 在使用前一定要make
2)make 的key 是不能重复,如果重复了,则以最后这个key-value为准
3)map 的value 是可以相同的。
4)map 的key-value 是无序的。
func make
func make(Type, size IntegerType) Type
make 内建函数分配并初始化一个类型为切片、映射、或(仅仅为)信道的对象。 与 new 相同的是,其第一个实参为类型,而非值。不同的是,make 的返回类型 与其参数相同,而非指向它的指针。其具体结果取决于具体的类型:
切片:size 指定了其长度。该切片的容量等于其长度。第二个整数实参可用来指定不同的容量;它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。
映射:初始分配的创建取决于 size,但产生的映射长度为0。size 可以省略,这种情况下就会分配一个小的起始大小。
信道:信道的缓存根据指定的缓存容量初始化。若 size 为零或被省略,该信道即为无缓存的。
map使用方式有下面几种,我们分别演示:
1)方式1
//声明,这时map=nil
var cities map[string]string
//make(map[string]string, 10) 分配一个map空间
cities = make (map[string]string, 10)
2)方式2
//声明,就直接make
var cities = make(map[string]string)
func main() {
cities := make(map[string]string)
cities["no1"] = "北京"
cities["no2"] = "天津"
cities["no3"] = "上海"
fmt.Println(cities)
}
3)方式3
//声明,直接赋值
var cities map[string]string = map[string]string {
"no4" : "成都",
}
cities["no1"] = "北京"
func main() {
var cities = map[string]string {"no4":"成都"}
cities["no1"] = "北京"
fmt.Println(cities)
}
也可以用类型推导:
func main() {
cities := map[string]string {"no4":"成都"}
cities["no1"] = "北京"
fmt.Println(cities)
}
课堂练习:演示一个key-value 的value 是map的案例
比如:我们要存放3个学生信息,每个学生有name和sex信息
思路:map[string]map[string]string
案例:
func main() {
studentMap := make(map[string]map[string]string, 10)
studentMap["stu01"] = make(map[string]string, 3)
studentMap["stu01"]["name"] = "tom"
studentMap["stu01"]["sex"] = "男"
studentMap["stu01"]["address"] = "北京长安街"
studentMap["stu02"] = make(map[string]string, 3) //这句话不能少
studentMap["stu02"]["name"] = "mary"
studentMap["stu02"]["sex"] = "女"
studentMap["stu02"]["address"] = "北京东沙村"
fmt.Println(studentMap["stu01"])
fmt.Println(studentMap["stu02"]["address"])
}