集合(Map)
1.1什么是Map
map是Go中的内置类型,它将一个值与 一个键关联起来。可以使用相应的键检索值。
Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key 类似于索引,指向数据的值
Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用hash表来实现的,也是引用类型
使用map过程中需要注意的几点:
- map是无序的,每次打印出来的map都会不-样,它不能通过index获取, 而必须通过key获取
- map的长度是不固定的,也就是和slice-样,也是一种引用类型
- 内置的len函数同样适用于map,返回map拥有的key的数量
- map的key可以是所有可比较的类型,如布尔型、整数型、浮点型、复杂型、字符串型…他可以键。
1.2 Map的使用
1.2.1 使用make()创建map
可以使用内建函数make也可以使用map关键字来定义Map:
/*声明变量,默认map是nil */var map_variablemap[key_data_type]value_data_type/*使用make函数*/map_variable = make(map[key_data_type ]value_ data_type)rating := map[string]float32 {\"C\":5, \"Go\" :4.5,\"Python\":4.5,\"C++\":2 }
代码:
// map[key类型]value类型var map1 map[int]string // map[]var map2 = make(map[int]string) // map[]map3 := map[int]string{1: \"go\", 2: \"java\", 3: \"c++\"} // map[1:go 2:java 3:c++]
如果不初始化map,那么就会创建一个nil map,nil map不能用来存放键值对(数据)
// map[key类型]value类型var map1 map[int]string // map[]var map2 = make(map[int]string) // map[]map3 := map[int]string{1: \"go\", 2: \"java\", 3: \"c++\"} // map[1:go 2:java 3:c++]fmt.Println(map1 == nil) // truefmt.Println(map2 == nil) // false make本身就初始化了fmt.Println(map3 == nil) // falseif map1 == nil {map1 = make(map[int]string)}
1.2.2 map存储和修改数据
map1[key] = value
key不存在获取的是默认值,string的默认值就是\”\”空字符串
var map1 = make(map[int]string) // map[]map1[1] = \"张三\"map1[2] = \"李四\"map1[3] = \"王五\"map1[4] = \"王二麻子\"fmt.Println(map1[1])// key不存在获取的是默认值,string的默认值就是\"\"空字符串fmt.Println(map1[40] == map1[39]) // truev1,ok := map1[40]fmt.Println(v1,ok) // false,表示当前的key没有赋值,就是说当前的v1是默认值
1.2.2 map删除数据
delete(map1, key):如果key存在就删除,如果key不存在也没什么影响
delete(map1,3)fmt.Println(map1)
1.2.3 map遍历
for key := range map1 {} :无序遍历
for key, value := range map1 {} :无序遍历
var map1 = make(map[int]string) // map[]map1[1] = \"张三\"map1[2] = \"李四\"map1[3] = \"王五\"map1[4] = \"王二麻子\"map1[5] = \"如花\"//1//2//5//3//4for key := range map1 {fmt.Println(key)}//2 李四//3 王五//4 王二麻子//5 如花//1 张三for key, value := range map1 {fmt.Println(key, value)}