Go:map
一、map的创建方式
func main() { // map创建方式1 // 声明后再make var stu1 map[int]string stu1 = make(map[int]string, 2) fmt.Println(stu1) // map[] stu1[1] = "哈哈" fmt.Println(stu1) // map[1:哈哈] // map创建方式2 // 声明时就make var stu2 = make(map[int]string, 2) fmt.Println(stu2) // map[] stu3 := make(map[int]string, 2) fmt.Println(stu3) // map[] // map创建方式3 // 声明时直接赋值,不需要make var stu4 = map[int]string{1: "路飞", 2: "佩奇"} fmt.Println(stu4) // map[1:路飞 2:佩奇] stu5 := map[int]string{1: "妖姬", 2: "瞎子"} fmt.Println(stu5) // map[1:妖姬 2:瞎子] }
二、map的增删改查
func main() { // 增加与修改 stu := make(map[int]string, 2) stu[1] = "哈哈" stu[2] = "嘻嘻" stu[1] = "呵呵" fmt.Println(stu) // map[1:呵呵 2:嘻嘻] // 删除 delete(stu, 1) fmt.Println(stu) // map[2:嘻嘻] // 如果要删除map的所有key,可以遍历逐个删除,也可以make一个新的map,让原来的成为垃圾,被gc回收 stu = make(map[int]string) fmt.Println(stu) // map[] // 查找 s := map[int]string{1: "哈哈", 2: "嘻嘻", 3: "呵呵"} val, ok := s[1] if ok { fmt.Println(val) // 哈哈 } else { fmt.Println("不存在此key") } }
三、map的遍历
func main() { // map遍历 s := map[int]string{1: "哈哈", 2: "嘻嘻", 3: "呵呵"} for k, v := range s { fmt.Printf("k=%d v=%s\n", k, v) } // k=1 v=哈哈 // k=2 v=嘻嘻 // k=3 v=呵呵 // 遍历复杂一点的map stu := make(map[int]map[string]string) stu[1] = make(map[string]string, 2) stu[1]["name"] = "妖姬" stu[1]["gender"] = "女" stu[2] = make(map[string]string, 2) stu[2]["name"] = "瞎子" stu[2]["gender"] = "男" for k1, v1 := range stu { fmt.Println(k1) for k2, v2 := range v1 { fmt.Printf("k2=%s v2=%s\n", k2, v2) } } // 1 // k2=name v2=妖姬 // k2=gender v2=女 // 2 // k2=name v2=瞎子 // k2=gender v2=男 }
四、map 切片
切片的数据类型如果是map,则我们称为 slice of map,map 切片,这样map个数就可以动态变化了。
func main() { // map切片示例 // 声明切片 var person []map[string]string person = make([]map[string]string, 1) // 增加person if person[0] == nil { person[0] = make(map[string]string, 2) person[0]["name"] = "妖姬" person[0]["age"] = "18" } // 因为切片大小为1,所以不能再使用上面方式增加person(越界) // 所以可以使用append函数,动态地增加person p := map[string]string{ "name": "瞎子", "age": "20", } person = append(person, p) fmt.Println(person) // [map[age:18 name:妖姬] map[age:20 name:瞎子]] }
五、总结
map的容量满后,再增加元素,会自动扩容,并不会panic,也就是说map能动态地增长键值对;
map的值也经常使用struct类型,更适合管理复杂的数据。