Go复合数据类型之映射

610 阅读6分钟

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

写在前面👀

今天主要讲讲Go的映射(Map)🍩
临近期末了,笔者也该备战考试了,今天也许是今年的最后一篇文章😶

一、什么是映射(Map)🍪

映射(Map) 是一种无序的键值对的集合🎂

  • map的特点🍰
  1. 一个map就是一个哈希表的引用
  2. 和切片一样,map是引用类型,未经初始化是不能赋值的
  3. 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)
}
  • 结果👇

image.png image.png

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)
}

  • 结果👇

image.png

2.删🥛

delete(map, key)函数删除一组键值对,其中 map 为要删除的 map 实例,key为要删除的 map 中键值对的键

  • 示例👇
delete(Student, 2103030105) //删除了学号为2103030105的学生
  • 结果👇

image.png

3.改🧃

  • 示例👇
Student[2103030106] = "大角牛"//将学号2103030106的学生姓名改为大角牛
  • 结果👇

image.png

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)
	}

}
  • 结果👇

image.png

(2)判断某个键是否存在🧉

在go语言中有个特殊的血法来判断map的键是否存在,格式如下👇

value,ok:=map[key]
  1. map代表待查的map名字,key代表要查找的键
  2. ok返回的是一个bool值
  3. 如果ok为true,则value返回该键的值;如果ok为false,返回的则是map值类型的默认值
  • 示例👇
/*查找学号为2103030105的学生是否存在*/
	name, ok := Student[2103030105]
	if ok {
		fmt.Printf("%s\n", name) //若存在,则输出该学生的姓名
	} else {
		fmt.Printf("查无此人!\n") //若不存,在则输出查无此人!
	}

  • 结果👇

image.png

四、按顺序遍历map🍶

遍历map时的元素顺序与添加键值对的顺序无关,因为遍历的顺序是随机的🍾 如果想按照指定顺序对map排序,可以先把map的key存进切片中,再引一个sort包

  1. 如果key是整型,创建一个int型切片,用sort包的Ints()函数对切片排序,再用range遍历key切片,用map[key]方式输出value
  2. 如果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])
	}
}

  • 结果👇

image.png

五、混合型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)
}

image.png

2. 值为slice类型的map🍹

  • 示例👇
package main

import "fmt"

var QinLi_Studio = map[string][]string{
	"前端组成员": {"宋俊唐", "王博", "李晚洋"},
	"后端组成员": {"郦志航", "提闯", "邹丽英"},
	"运维组成员": {"高青汉", "李闯", "梁晓宇"},
}

func main() {
	fmt.Println(QinLi_Studio)
}
  • 结果👇

image.png

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)
}
  • 结果👇

image.png

写在后面🍻

感谢观看啦✨
我的14天更文挑战成功了🥂
感谢掘金的运营同学,审核辛苦了💗 PS:有什么不足,欢迎指出哦💖