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

在这里插入图片描述

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


1 map基本介绍

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

2 map声明

2.1 语法

var map 变量名 map[keytype]valuetype
bool, 数字, string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组slice, map 还有 function 不可以

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 , 分配内存后才能赋值和使用。
案例演示:
在这里插入图片描述
代码说明:

  1. map 在使用前一定要 make
  2. map 的 key 是不能重复, 如果重复了, 则以最后这个 key-value 为准
  3. map 的 value 是可以相同的.
  4. map 的 key-value 是无序
  5. make 内置函数数目
    在这里插入图片描述
3 map的使用方式

3.1 方式1

在这里插入图片描述

3.2 方式2

在这里插入图片描述

3.3 方式3

在这里插入图片描述

4 map的增删改查

4.1 map的增加和更新

在这里插入图片描述

4.2 map的删除

delete(map, "key")

在这里插入图片描述
在这里插入图片描述
细节说明:
如果我们要删除 map 的所有 key ,没有一个专门的方法一次删除, 可以遍历一下 key, 逐个删除或者 map = make(…), make 一个新的, 让原来的成为垃圾, 被 gc 回收
在这里插入图片描述

4.3 map查找

在这里插入图片描述

说明: 如果 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的长度

4.6 ma'p

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 【案例演示】
    在这里插入图片描述
  2. map 的容量达到后, 再想 map 增加元素, 会自动扩容, 并不会发生 panic, 也就是说 map 能动
    态的增长 键值对(key-value)
  3. map 的 value 也经常使用 struct 类型, 更适合管理复杂的数据(比前面 value 是一个 map 更好),比如 value 为 Student 结构体 【案例演示, 因为还没有学结构体, 体验一下即可】
    在这里插入图片描述