之前我学过C、Java、Python语言时总结的经验:
- 先建立整体框架,然后再去抠细节。
- 先Know how,然后know why。
- 先做出来,然后再去一点点研究,才会事半功倍。
- 适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。
- 对于GO语言,切记遵守语法格式规则。(例如python语言、例如SpringBoot框架等)
解释:某些知识点,就是很难了解,那么先做出来,然后继续向前学习,可能在某个时间点我们就会恍然大悟。
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声明的举例:
注意:声明是不会分配内存的,初始化需要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]
}
map2 := make(map[string]string)
map2["n3"] = "zhangsan3"
map2["n4"] = "zhangsan4"
fmt.Println(map2) // map[n3:zhangsan3 n4:zhangsan4]
map3 := map[string]string{
"n5": "zhangsan5",
"n6": "zhangsan6",
}
fmt.Println(map3) // map[n5:zhangsan5 n6:zhangsan6]
新增和更改
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]
删除的 细节: 删除所有的元素
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
}