Map(Map并不是线程安全的)
如果要线程安全的map则使用
syncMap sync.Map
1.Map的定义和初始化(必须要初始化才能使用!与slice不同)
//map是一个key(索引)和value(值)的无序集合,主要是查询方便 o(1)
var courseMap = map[string]string{
"go": "go工程师",
"grpc": "grpc入门",
"gin": "gin深入理解",
}
2.Map的取值和放值
//取值
fmt.Println(courseMap["grpc"])
//放值
courseMap["mysql"] = "mysql的原理"
fmt.Println(courseMap)
(1.如果不初始化,则无法给map设置值
var courseMap=map[string]string //nil,map类型想要设值的时候必须要先初始化。
courseMap["mysql"] = "mysql的原理"
fmt.Println(courseMap)
会提示此时map为nil
(2.可以给map初始化为空(非nil)
(1).第一种初始化方法
var courseMap = map[string]string{}
//nil,map类型想要设值的时候必须要先初始化。
courseMap["mysql"] = "mysql的原理"
fmt.Println(courseMap)
此时加上{}后,map则为空初始化便可以正常设值进入。
(2).第二种初始化方法(比较常用)
var courseMap1 = make(map[string]string, 3)
//make是内置函数,主要用于初始化slice,map,channel
3.Map的遍历(无序打印,不能保证每次打印都为相同顺序)
如果想要完成顺序或者有序打印可以结合slice和map一起使用
(1.key和value都打印
//Map的遍历
for key, value := range courseMap {
fmt.Println(key,value)
}
(2.只打印value用“_”隐藏数据类型代替key
//Map的遍历
for _, value := range courseMap {
fmt.Println(value)
}
(3.只通过key打印
//Map的遍历
for key := range courseMap {
fmt.Println(key,courseMap[key])
}
4.判断Map中是否存在元素
(1.通过if语句判断该Map中是否还有java这个key,如果有则打印key的value
d, ok := courseMap["java"]
if !ok {
fmt.Println("not in")
} else {
fmt.Println("find", d)
}
//缩写过后
if d, ok := courseMap["java"];!ok{
fmt.Println("not in")
} else {
fmt.Println("find", d)
}
courseMap["java"] = "java工程师"
此时便可以找到key=java,则打印java的value
反之
无法通过以下语句debug判断是否存在key为java
d := courseMap["java"]
fmt.Println(d)
因为当我们给Map中塞入一个key为java但是value为空的时候会发现与寻找一个不存在的key的debug测试相同,
此时我们就需要通过if语句进行判断
courseMap["java"] = ""
d := courseMap["java"]
fmt.Println(d)
5.删除Map中的元素
delete(courseMap, "grpc")
fmt.Println(courseMap)
可以删除不存在的元素,并不会报错