集合(Map)

1.1什么是Map

map是Go中的内置类型,它将一个值与 一个键关联起来。可以使用相应的键检索值。

Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key 类似于索引,指向数据的值

Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用hash表来实现的,也是引用类型

使用map过程中需要注意的几点:

  1. map是无序的,每次打印出来的map都会不-样,它不能通过index获取, 而必须通过key获取
  2. map的长度是不固定的,也就是和slice-样,也是一种引用类型
  3. 内置的len函数同样适用于map,返回map拥有的key的数量
  4. map的key可以是所有可比较的类型,如布尔型、整数型、浮点型、复杂型、字符串型…他可以键。

1.2 Map的使用

1.2.1 使用make()创建map

可以使用内建函数make也可以使用map关键字来定义Map:

/*声明变量,默认map是nil */
var map_variable
map[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)}