「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
写在前面👀
今天主要讲讲Go的映射(Map)🍩
临近期末了,笔者也该备战考试了,今天也许是今年的最后一篇文章😶
一、什么是映射(Map)🍪
映射(Map) 是一种无序的键值对的集合🎂
- map的特点🍰
- 一个map就是一个哈希表的引用
- 和切片一样,map是引用类型,未经初始化是不能赋值的
- Go的映射语法和python字典和json有点相似,都是以键值对的方式存储数据,通过给定的key就可以迅速找到value
二、map的声明与初始化赋值🧁
1.用map关键字声明map🍫
键和值总是一对一的形式🍭
- 语法👇
var mapname map[key_type] value_type
//key_type代表键的类型(该类型必须可以用==比较),value_type代表值的类型
2.用make()函数初始化map🍬
map类型的变量默认初始值为nil,使用make()函数可以为他分配内存,只有非nil的map才能直接赋值🍡
- 语法👇
make(map[key_type] value_type,cap)
//cap表示map的容量,为可选参数,可以用len()函数返回他的容量
- 示例👇
/*错误示例❗*/
package main
import (
"fmt"
)
var Student map[int]string //声明一个键类型为int,值类型为string名字叫Student的map
func main() {
fmt.Println(Student == nil)
Student[2103030105] = "王一惠" //只声明但未初始化,nil映射不能直接赋值,编译器会报错
}
/*正确示例✅*/
package main
import (
"fmt"
)
var Student map[int]string //声明一个键类型为int,值类型为string名字叫Student的map
func main() {
Student = make(map[int]string) //用make()函数对Stufent初始化了
fmt.Println(Student == nil) //此时值不为nil
Student[2103030105] = "王一惠"
fmt.Println(Student)
}
- 结果👇
3.用map字面值语法初始化🍮
- 语法👇
全局初始化:
var Student = map[int]string{
2103030105: "王一惠",
2103030106: "郦志航",
2103030107: "白新帅",
2103030108: "黄飞鸣",
}
局部初始化:
Student := map [int] string {
2103030105 : "王一惠" ,
2103030106 : "郦志航" ,
2103030107 : "白新帅" ,
2103030108 : "黄飞鸣" ,
}
三、map的基本用法🍯
1.增🍼
- 示例👇
package main
import "fmt"
var Student = map[int]string{
2103030105: "王一惠",
2103030106: "郦志航",
2103030107: "白新帅",
2103030108: "黄飞鸣",
}
func main() {
/*为Student增加两名同学*/
Student[2103030109] = "许祥宇"
Student[2103030110] = "孙庆琨"
fmt.Println(Student)
}
- 结果👇
2.删🥛
用delete(map, key)函数删除一组键值对,其中 map 为要删除的 map 实例,key为要删除的 map 中键值对的键
- 示例👇
delete(Student, 2103030105) //删除了学号为2103030105的学生
- 结果👇
3.改🧃
- 示例👇
Student[2103030106] = "大角牛"//将学号2103030106的学生姓名改为大角牛
- 结果👇
4.查☕
(1)用for range遍历map🍵
- 示例👇
package main
import "fmt"
var Student = map[int]string{
2103030105: "王一惠",
2103030106: "郦志航",
2103030107: "白新帅",
2103030108: "黄飞鸣",
}
func main() {
/*为Student增加两名同学*/
Student[2103030109] = "许祥宇"
Student[2103030110] = "孙庆琨"
delete(Student, 2103030105) //删除了学号为2103030105的学生
Student[2103030106] = "大角牛" //将学号2103030106的学生姓名改为大角牛
/*number代表键,name代表值,如果只需要值可以用匿名变量_代替number的位置*/
for number, name := range Student {
fmt.Printf("学号:%d 姓名:%s\n", number, name)
}
}
- 结果👇
(2)判断某个键是否存在🧉
在go语言中有个特殊的血法来判断map的键是否存在,格式如下👇
value,ok:=map[key]
- map代表待查的map名字,key代表要查找的键
- ok返回的是一个bool值
- 如果ok为true,则value返回该键的值;如果ok为false,返回的则是map值类型的默认值
- 示例👇
/*查找学号为2103030105的学生是否存在*/
name, ok := Student[2103030105]
if ok {
fmt.Printf("%s\n", name) //若存在,则输出该学生的姓名
} else {
fmt.Printf("查无此人!\n") //若不存,在则输出查无此人!
}
- 结果👇
四、按顺序遍历map🍶
遍历map时的元素顺序与添加键值对的顺序无关,因为遍历的顺序是随机的🍾 如果想按照指定顺序对map排序,可以先把map的key存进切片中,再引一个
sort包
- 如果
key是整型,创建一个int型切片,用sort包的Ints()函数对切片排序,再用range遍历key切片,用map[key]方式输出value - 如果
key是字符串型,创建一个string型切片,用sort包的Strings()函数对切片排序,在通过range遍历key切片,用map[key]方式输出value
- 示例👇
package main
import (
"fmt"
"sort"
)
var Student = map[int]string{
2103030106: "郦志航",
2103030105: "王一惠",
2103030108: "黄飞鸣",
2103030107: "白新帅",
}
func main() {
//创建一个int型切片(容量要够)用来存学号(key)
slice_student := make([]int, 0, 10)
//用for range循环和append函数将学号存入切片中
for number := range Student {
slice_student = append(slice_student, number)
}
sort.Ints(slice_student) //对学号排序
//通过key输出value
for _, key := range slice_student {
fmt.Printf("学号:%d 姓名:%s\n", key, Student[key])
}
}
- 结果👇
五、混合型map🍷
1. 值为map类型的map🍸
package main
import "fmt"
var Student = map[int]map[string]int{
2103030106: {"郦志航":18},
2103030105: {"王一惠":19},
2103030108: {"黄飞鸣":19},
2103030107: {"白新帅":17},
}
func main() {
fmt.Println(Student)
}
2. 值为slice类型的map🍹
- 示例👇
package main
import "fmt"
var QinLi_Studio = map[string][]string{
"前端组成员": {"宋俊唐", "王博", "李晚洋"},
"后端组成员": {"郦志航", "提闯", "邹丽英"},
"运维组成员": {"高青汉", "李闯", "梁晓宇"},
}
func main() {
fmt.Println(QinLi_Studio)
}
- 结果👇
3.元素类型为map的slice🍺
- 示例👇
package main
import "fmt"
//对切片初始化
var Student = make([]map[string]string, 2, 100)
func main() {
Student[0] = make(map[string]string, 10) //对切片中的map元素初始化
Student[0]["姓名"] = "郦志航"
Student[0]["学号"] = "2103030106"
Student[0]["籍贯"] = "衢州"
Student[1] = make(map[string]string, 10) //对切片中的map元素初始化
Student[1]["姓名"] = "白新帅"
Student[1]["学号"] = "2103030107"
Student[1]["籍贯"] = "大连"
fmt.Println(Student)
}
- 结果👇
写在后面🍻
感谢观看啦✨
我的14天更文挑战成功了🥂
感谢掘金的运营同学,审核辛苦了💗 PS:有什么不足,欢迎指出哦💖