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类型,更适合管理复杂的数据。

 

posted @ 2019-05-27 00:31  就俗人一个  阅读(155)  评论(0编辑  收藏  举报