10【保姆级】-GO语言的map
之前我学过C、Java、Python语言时总结的经验:
- 先建立整体框架,然后再去抠细节。
- 先Know how,然后know why。
- 先做出来,然后再去一点点研究,才会事半功倍。
- 适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。
- 对于GO语言,切记遵守语法格式规则。(例如python语言、例如SpringBoot框架等)
解释:某些知识点,就是很难了解,那么先做出来,然后继续向前学习,可能在某个时间点我们就会恍然大悟。
一、map
1.1 基本定义
map是key-value数据组构又称为字段或者关联数组。类似其它编程语言的集合在编程中是经常使用到。
基本语法
var map变量名 map [keytype] valuetype
key 可以是什么类型
golang中的map,的 key 可以是很多种类型,比如 bool, 数字,string,指针channel,还可以是只包含前面几个类型的 接口,结构体,数组
通常为int、string(其他类型很少使用)
注意: slice, map 还有 function 不可以,因为这几个没法用 == 来判断
valuetype 可以是什么类型
valuetype的类型和key基本一样。通常为: 数字(整数,浮点数),string,map,struct
map声明的举例:
- var a map[string]string
- var a map[stringlint
- var a map[int]string
- var a map[string]map[string] string
注意:声明是不会分配内存的,初始化需要make ,分配内存后才能赋值和使用
1.2 使用的3种方式
1.2.1 方式1 先声明后make
- map在使用前一定要make
- map的 key 是不能重复,如果重复了,则以最后这个 key-value 为准
- map的 value 是可以相同的
- map的 key-value 是无序
- make内置函数数目
func main() {
//map 的声明和注意事项
var a map[string]string
// 使用前,需要先make。作用是:分配数据空间
// make(map[string]string , 容量)
// 容量:可以加入多少对数据
a = make(map[string]string, 10)
a["N1"] = "张三1"
a["N2"] = "张三2"
a["N2"] = "张三22(我就替换了上面的 张三2)"
a["N3"] = "我也叫张三1"
fmt.Println(a) // map[N2:张三22(我就替换了上面的 张三2) N1:张三1 N3:我也叫张三1]
}
1.2.2 方式2 声明的时候就make
map2 := make(map[string]string)
map2["n3"] = "zhangsan3"
map2["n4"] = "zhangsan4"
fmt.Println(map2) // map[n3:zhangsan3 n4:zhangsan4]
1.2.3 方式3 不make,直接赋值
map3 := map[string]string{
"n5": "zhangsan5",
"n6": "zhangsan6",
}
fmt.Println(map3) // map[n5:zhangsan5 n6:zhangsan6]
1.3 map的crud
新增和更改
ps:如果key存在,那么就跟新,如果不存在,就会增加。
func main() {
map2 := make(map[string]string)
map2["n1"] = "zhangsan1"
fmt.Println(map2) // map[n1:zhangsan1]
map2["n1"] = "zhangsanupdete"
fmt.Println(map2) // map[n1:zhangsanupdete]
}
删除. 内置函数delete
fmt.Println(map2) // 删除前:map[n1:zhangsanupdete n2:zhangsan2 n3:zhangsan2444]
delete(map2,"n3")
fmt.Println(map2) // 删除后: map[n1:zhangsanupdete n2:zhangsan2]
删除的 细节: 删除所有的元素
- 如果我们要删除map的所有key ,没有一个专门的方法一次删除,可以遍历一下key,逐个删除
- 或者Tmap = make(…),make一个新的,让原来的成为垃圾,被gc回收
map2 := make(map[string]string)
map2["n1"] = "zhangsan1"
fmt.Println(map2) // map[n1:zhangsan1]
map2 = make(map[string]string)
fmt.Println(map2) // map[]
map 的查找
查找成功:true 。
查找失败:flase
map2 := make(map[string]string)
map2["n1"] = "zhangsan1"
value, err := map2["n1"]
if err {
fmt.Println("对应的value:", value) // 对应的value: zhangsan1
} else {
fmt.Println("没有找到:", err) // 没有找到: false
}