发布时间:2023-02-28 18:00
map是key-value数据结构,又称为字段或者关联数组.类似于其它编程语言的集合,在编程中进程使用
var map变量名 map[keytype]valuetype
keytype可以是什么类型?
go中的map的key可以是多种类型:bool,数字(整数,浮点数),string,指针,channel,还可以是只包含前面几种类型的接口,结构体,数组
key的类型通常为int,string
注意: slice,map还有function不可以作为key,因为这几个没法用 == 来判断
keytype可以是什么类型?
valuetype的类型和key基本一样,通常为数字(整数,浮点数),string,map,struct
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string
注意: 声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
func main() {
//map的声明和注意事项
var a map[string]string
//当声明map后,直接输出,结果:map[]
fmt.Println(a) //map[]
//如果直接给map赋值,会报错:panic: assignment to entry in nil map(没有给map分配数据空间)
// a["name"] = "张三"
//在使用map前,需要先make,make的作用是给map分配数据空间
a = make(map[string]string, 10)
a["name"] = "张三"
a["name1"] = "张三1"
a["name"] = "李四"
fmt.Println(a)
}
1.map在使用前一定要make
2.map的key是不能重复的,如果重复了,则以最后这个key-value为准
3.map的value可以是相同的
4.map的key-value是无序的
package main
import (
"fmt"
)
func main() {
//第一种使用方式
var a map[string]string
//在使用map前,需要先make,make的作用是给map分配数据空间
a = make(map[string]string, 10)
a["name"] = "张三"
a["name1"] = "张三1"
a["name"] = "李四"
fmt.Println(a)
//推荐使用:第二种使用方式
cities := make(map[string]string)
cities["c1"] = "北京"
cities["c2"] = "上海"
cities["c3"] = "广州"
fmt.Println(cities)
//第三种使用方式
var heros map[string]string = map[string]string{
"h1":"张三",
"h2":"李四", //最后一个逗号不能少
}
// heros := map[string]string {
// "h1":"张三",
// "h2":"李四",
// }
heros["h3"] = "王五"
fmt.Println(heros)
}
/**
* 案例: 演示一个key-value:
* 存放三个学生消息,每个学生有姓名,性别
* 思路: map[string]map[string]string
*/
students := make(map[string]map[string]string)
students["0001"] = make(map[string]string, 2)
students["0001"]["name"] = "张三"
students["0001"]["sex"] = "男"
students["0002"] = make(map[string]string, 2)
students["0002"]["name"] = "赵敏"
students["0002"]["sex"] = "女"
fmt.Println(students)
package main
import (
"fmt"
)
func main() {
//增加,修改
cities := make(map[string]string)
cities["c1"] = "北京"
cities["c2"] = "上海"
cities["c3"] = "广州"
fmt.Println(cities)
//因为c1这个key已经存在,故下面的是修改
cities["c1"] = "重庆"
fmt.Println(cities)
//删除
delete(cities, "c1")
fmt.Println(cities)
//当delete指定的key不存在时,删除不会操作,也不会报错
delete(cities, "c4")
fmt.Println(cities)
}
map删除
说明:
delete(map,key),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,就不操作,但也不报错
细节说明
如果要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除或者map = make(...),make一个新的,让原来的成为垃圾,被GC回收
//如果希望一次性删除所有的key
//1.变遍历所有的key,再足个删除
//2.直接make一个新的空间
cities := make(map[string]string)
fmt.Println(cities)
//演示map的查找
val, ok := cities["c1"]
if ok {
fmt.Printf("存在c1这个key,值为%v\n", val)
} else {
fmt.Println("不存在c1这个key")
}
案例演示一个相对复杂的map遍历,该map的value又是一个map
说明:map的遍历使用for-range的结构遍历
package main
import (
"fmt"
)
func main() {
//使用for-range遍历
var a map[string]string
a = make(map[string]string)
a["name"] = "张三"
a["name1"] = "张三1"
a["name"] = "李四"
fmt.Println(a)
for k, v := range a {
fmt.Printf("k=%v,v=%v\n",k, v)
}
//使用for-range遍历比较复杂的map
/**
* 案例: 演示一个key-value:
* 存放三个学生消息,每个学生有姓名,性别
* 思路: map[string]map[string]string
*/
students := make(map[string]map[string]string)
students["0001"] = make(map[string]string, 2)
students["0001"]["name"] = "张三"
students["0001"]["sex"] = "男"
students["0002"] = make(map[string]string, 2)
students["0002"]["name"] = "赵敏"
students["0002"]["sex"] = "女"
fmt.Println(students)
fmt.Println()
for key, val := range students {
fmt.Printf("key=%v\n", key)
for k, v := range val {
fmt.Printf("\t k=%v, v=%v\n", k,v)
}
}
}
//统计map长度
a := make(map[int]int,2)
a[1] = 1
a[2] = 2
fmt.Println("a中有", len(a), "对key-value")
[上一节][go学习笔记.第八章.排序和查找] 3.二维数组练习
[下一节][go学习笔记.第九章.map] 2.map的切片,排序以及注意事项
Python机器学习实战教学——基于协同过滤的电影推荐系统(超详细教学,算法分析)
cs224w(图机器学习)2021冬季课程学习笔记9 Graph Neural Networks 2: Design Space
【kaldi】chain-model的TCP server部署
比特币的双花问题——哈尔滨工程大学计算机学院2021区块链技术课程
vue3【watch检测/监听】watch检测数据变化&&监听使用
Angular中ng-template和ng-container的应用小结
解决STM32F103C8T6使用ST-Link V2烧录的问题
2020李宏毅机器学习笔记-Anomaly Detection