map数据类型:key:value数据类型的数据结构,又叫字典或关系组。
map是引用类型。
一、map定义与初始化
1.1、map定义
var map01 map[string]string // 声明key是字符串类型,值是字符串类型的map
var map02 map[string]int // 声明key是字符串类型,值是整型的map
var map03 map[int]string // 声明key是整型,值是字符串类型的map
var map04 map[string]map[string]string // 声明key是字符串类型,值是map类型的map
map定义后需要初始化后才可以使用,如果不初始化直接使用会panic。
1.2、map初始化
可以在定义map的时候直接给map赋值,也可以使用make函数来初始化map,下面是map的定义与初始化示例:
func testMap() {
// 方法一、先定义map,然后make初始化map,最后赋值
var a map[string]string // 声明名为a的map (支持简写,:= 的方式)
a = make(map[string]string,10) // 初始化a,长度等于10
a["name"] = "dream" // 赋值操作
a["age"] = "18"
// 方法二、通过推导的方式直接make初始化,然后赋值
a := make(map[string]string,10) // 定义与初始化a,长度等于10
a["name"] = "dream" // 赋值操作
a["age"] = "18"
// 方法三、定义与赋值一起操作了(// map[key的类型]value类型)
var a map[string]string = map[string]string{
"name": "dream",
"age": "18",
}
fmt.Println(a) // 结果为:map[age:18 name:dream]
// 方法四、key是string,值是map类型的map定义与初始化
a := make(map[string]map[string]string, 10) // 定义与初始化一个值为map类型的map
a["person_obj"] = make(map[string]string) // 初始化值的map(由于值类型是map,需要先初始化值的map,如果不初始化调用就会报错)
a["test"] = make(map[string]string) // 初始化第二个值得map类型
// 往map里插入数据
a["person_obj"]["name"] = "dream" // 赋值操作(插入数据)
a["person_obj"]["age"] = "22"
a["person_obj"]["salary"] = "20000"
a["test"]["name"] = "zs"
a["test"]["age"] = "80"
fmt.Println(a) // 查看结果,结果为:map[person_obj:map[age:22 name:dream salary:20000] test:map[age:80 name:zs]]
// 方法五: 直接定义,后面在使用
message := map[string]string{}
message["msg"] = "生成验证码失败,请联系管理员"
message["Code"] = "500"
}
二、map的增删该查操作
func testMap2() {
a := make(map[string]map[string]string, 10) // 定义与初始化一个值为map的map
a["person_obj"] = make(map[string]string) // 初始化值的map(由于值类型是map,需要先初始化值得map,如果不初始化调用就会报错)
// 往map里插入数据
a["person_obj"]["name"] = "dream" // 赋值操作(插入数据)
a["person_obj"]["age"] = "22"
a["person_obj"]["salary"] = "20000"
fmt.Println(a) // 结果为:map[person_obj:map[age:22 name:dream salary:20000]]
// 从map里获取数据
k, ok := a["person_obj"] // 获取数据,k的值为key对应的值,ok为判断值是否存在(有值时ok为true、无值时ok为false)
if ok {
fmt.Println(k) // 结果为:map[age:22 name:dream salary:20000]
fmt.Println(k["name"]) // 结果为:dream
}
fmt.Println(ok) // 结果为:true
// 删除map里的数据(如果要清空一个map只能for循环一个一个的删,或者重新make一下)
delete(a["person_obj"], "salary")
fmt.Println(a)
// 遍历map(map的值是map时需要使用两个循环)
for k, v := range a {
fmt.Println(k)
for k1, v1 := range v {
fmt.Println(k1,v1)
}
}
// 打印map长度
fmt.Println(len(a))
// 更新操作
a["person_obj"]["age"] = "23"
fmt.Println(a)
}
三、map实战联系
3.1、给未知map进行赋值操作(不知道这个未知的map有没有初始化)
package main
import "fmt"
func testMap3(a map[string]map[string]string) {
_, ok := a["zhangsan"]
if !ok { // 判断a这个map里有没有“zhangsan”这个key,如果没有这个值就初始化值这个map,还可以这么判断(如果张三这个值为空就初始化):if a["zhangsan"] == nil {执行初始化}
a["zhangsan"] = make(map[string]string) // 没有值就初始化值这个map
}
a["zhangsan"]["password"] = "123456" // 给值这个map赋值
a["zhangsan"]["email"] = "zhangsan@qq.com"
fmt.Println("in make :",a) // 结果为:in make : map[zhangsan:map[email:zhangsan@qq.com password:123456]]
return // 遇到return后,代码就不向下执行了
}
func main() {
a := make(map[string]map[string]string, 100)
testMap3(a)
}
3.2、切片里的元素是map的操作
package main
import "fmt"
func mapDemo1() {
var mapSlice = make([]map[string]string, 3) // 初始化切片,mapSlice[0]为map
fmt.Println(mapSlice) // 结果为:[map[] map[] map[]]
// 对切片中的map元素进行初始化
mapSlice[0] = make(map[string]string, 10) // 初始化切片的第一个元素(也就是map)
mapSlice[0]["name"] = "小王子" // 给切片的第一个元素(map)赋值
mapSlice[0]["password"] = "123456"
mapSlice[0]["address"] = "沙河"
fmt.Println(mapSlice) // 结果为:[map[address:沙河 name:小王子 password:123456] map[] map[]]
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}
// 循环的执行结果为:
// index:0 value:map[address:沙河 name:小王子 password:123456]
// index:1 value:map[]
// index:2 value:map[]
func main() {
mapDemo1()
}
3.3、map里的值为切片类型的操作
func mapDemo2() {
var sliceMap = make(map[string][]string, 3) // 初始化一个map[字符串类型]切片类型,长度为3
fmt.Println("sliceMap:",sliceMap) // 结果:map[]
key := "中国"
value, ok := sliceMap[key] // 判断key存不存在sliceMap这个字典里
if !ok { // 如果map里不存在key这个值
value = make([]string, 2) // 初始化一个切片并赋值给value
}
value = append(value, "北京", "上海") // 使用append()函数往value切片里追加:"北京", "上海" 两个值
sliceMap[key] = value // 给sliceMap 赋值,[中国] = "北京", "上海"
fmt.Println(sliceMap) // 结果为:map[中国:[北京 上海]]
}
3.4、int类型的map排序
func testMapSort() {
a := make(map[int]int,5) // 定义与初始化一个map
a[1] = 10 // 添加数值
a[3] = 11
a[5] = 12
a[8] = 13
var keys []int // 定义一个空切片
for k, _ := range a { // 循环map获取map的key
keys = append(keys, k) // 往keys切片里写入循环获取到的map的key
}
sort.Ints(keys) // 通过sort包向的Ints排序keys切片里面的key
for _, v := range keys {
fmt.Println(v,a[v]) // 根据排序后的key获取map里面的值
}
}
// 执行结果为:
1 10
3 11
5 12
8 13
3.5、两个map之间的反转
func mapRevert() {
a := make(map[string]int,5) // 定义并初始化两个map
b := make(map[int]string,5)
a["abc"] = 135 // 给a map赋值
a["def"] = 246
fmt.Println("map a:",a) // 结果为:map a: map[abc:135 def:246]
for k, v := range a { // 循环a map
b[v] = k // 给b map赋值,b的键等是a的值、值是a的键
}
fmt.Println("map b:",b) // 结果为:map b: map[135:abc 246:def]
}