【golang学习总结】10 golang中map用法

本文介绍SpringBoot相关内容。和【跨考菌】一起加油吧~

在这里插入图片描述

如果你有收获,记得帮博主一键三连哦


1 map基本介绍

map 是 key-value 数据结构, 又称为字段或者关联数组。 类似其它编程语言的集合,
在编程中是经常使用到

2 map声明

2.1 语法

var map 变量名 map[keytype]valuetype

  • key 可以是什么类型
    golang 中的 map, 的 key 可以是很多种类型, 比如 bool, 数字, string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组
    通常 key 为 int 、 string
    注意: slice, map 还有 function 不可以, 因为这几个没法用 == 来判断
  • valuetype 可以是什么类型
    valuetype 的类型和 key 基本一样, 这里我就不再赘述了
    通常为: 数字(整数,浮点数),string,map,struct

2.2 map声明举例

map 声明的举例:

var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string

注意: 声明是不会分配内存的, 初始化需要 make , 分配内存后才能赋值和使用。
案例演示:
【golang学习总结】10 golang中map用法_第1张图片
代码说明:

  1. map 在使用前一定要 make
  2. map 的 key 是不能重复, 如果重复了, 则以最后这个 key-value 为准
  3. map 的 value 是可以相同的.
  4. map 的 key-value 是无序
  5. make 内置函数数目
    【golang学习总结】10 golang中map用法_第2张图片

3 map的使用方式

3.1 方式1

【golang学习总结】10 golang中map用法_第3张图片

3.2 方式2

【golang学习总结】10 golang中map用法_第4张图片

3.3 方式3

【golang学习总结】10 golang中map用法_第5张图片

4 map的增删改查

4.1 map的增加和更新

【golang学习总结】10 golang中map用法_第6张图片

4.2 map的删除

delete(map, "key") , delete 是一个内置函数, 如果 key 存在, 就删除该 key-value,如果 key 不存在,不操作, 但是也不会报错

【golang学习总结】10 golang中map用法_第7张图片
【golang学习总结】10 golang中map用法_第8张图片
细节说明:
如果我们要删除 map 的所有 key ,没有一个专门的方法一次删除, 可以遍历一下 key, 逐个删除或者 map = make(…), make 一个新的, 让原来的成为垃圾, 被 gc 回收
【golang学习总结】10 golang中map用法_第9张图片

4.3 map查找

【golang学习总结】10 golang中map用法_第10张图片

说明: 如果 heroes 这个 map 中存在 “no1” , 那么 findRes 就会返回 true,否则返回 false

4.4 map遍历

案例演示相对复杂的 map 遍历: 该 map 的 value 又是一个 map
说明: map 的遍历使用 for-range 的结构遍历

//使用for-range遍历map
	//第二种方式
	cities := make(map[string]string)
	cities["no1"] = "北京"
	cities["no2"] = "天津"
	cities["no3"] = "上海"
	
	for k, v := range cities {
		fmt.Printf("k=%v v=%v\n", k, v)
	}

	fmt.Println("cities 有", len(cities), " 对 key-value")

	//使用for-range遍历一个结构比较复杂的map
	studentMap := make(map[string]map[string]string)
	
	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"] = "上海黄浦江~"

	for k1, v1 := range studentMap {
		fmt.Println("k1=", k1)
		for k2, v2 := range v1 {
				fmt.Printf("\t k2=%v v2=%v\n", k2, v2)
		}
		fmt.Println()
	}

4.5 map的长度

【golang学习总结】10 golang中map用法_第11张图片

5 map切片

切片的数据类型如果是 map, 则我们称为 slice of map, map 切片, 这样使用则 map 个数就可以动态变化了。

5.1 使用案例

要求: 使用一个 map 来记录 monster 的信息 name 和 age, 也就是说一个 monster 对应一个 map,并且妖怪的个数可以动态的增加=>map 切片

//演示map切片的使用
	/*
	要求:使用一个map来记录monster的信息 name 和 age, 也就是说一个
	monster对应一个map,并且妖怪的个数可以动态的增加=>map切片
	*/
	//1. 声明一个map切片
	var monsters []map[string]string
	monsters = make([]map[string]string, 2) //准备放入两个妖怪
	//2. 增加第一个妖怪的信息
	if monsters[0] == nil {
		monsters[0] = make(map[string]string, 2)
		monsters[0]["name"] = "牛魔王"
		monsters[0]["age"] = "500"
	}

	if monsters[1] == nil {
		monsters[1] = make(map[string]string, 2)
		monsters[1]["name"] = "玉兔精"
		monsters[1]["age"] = "400"
	}

	// 下面这个写法越界。
	// if monsters[2] == nil {
	// 	monsters[2] = make(map[string]string, 2)
	// 	monsters[2]["name"] = "狐狸精"
	// 	monsters[2]["age"] = "300"
	// }

	//这里我们需要使用到切片的append函数,可以动态的增加monster
	//1. 先定义个monster信息
	newMonster := map[string]string{
		"name" : "新的妖怪~火云邪神",
		"age" : "200",
	}
	monsters = append(monsters, newMonster)

	fmt.Println(monsters)

说明:

  • 可以通过append动态增加map切片的元素个数。

6 map排序

6.1基本介绍

  1. golang 中没有一个专门的方法针对 map 的 key 进行排序
  2. golang 中的 map 默认是无序的, 注意也不是按照添加的顺序存放的, 你每次遍历, 得到的输出
    可能不一样. 【案例演示 1】
  3. golang 中 map 的排序, 是先将 key 进行排序, 然后根据 key 值遍历输出即可
//map的排序
	map1 := make(map[int]int, 10)
	map1[10] = 100
	map1[1] = 13
	map1[4] = 56
	map1[8] = 90

	fmt.Println(map1)

	//如果按照map的key的顺序进行排序输出
	//1. 先将map的key 放入到 切片中
	//2. 对切片排序 
	//3. 遍历切片,然后按照key来输出map的值

	var keys []int
	for k, _ := range map1 {
		keys = append(keys, k)
	}
	//排序
	sort.Ints(keys)
	fmt.Println(keys)

	for _, k := range keys{
		fmt.Printf("map1[%v]=%v \n", k, map1[k])
	}

7 map的使用细节

  1. map 是引用类型, 遵守引用类型传递的机制, 在一个函数接收 map, 修改后, 会直接修改原来
    的 map 【案例演示】
    【golang学习总结】10 golang中map用法_第12张图片
  2. map 的容量达到后, 再想 map 增加元素, 会自动扩容, 并不会发生 panic, 也就是说 map 能动
    态的增长 键值对(key-value)
  3. map 的 value 也经常使用 struct 类型, 更适合管理复杂的数据(比前面 value 是一个 map 更好),比如 value 为 Student 结构体 【案例演示, 因为还没有学结构体, 体验一下即可】
    【golang学习总结】10 golang中map用法_第13张图片

你可能感兴趣的:(golang学习总结,golang,map)