map的操作特性
1)初始化
map分别支持字面量初始化和内置函数make()的初始化
字面量初始化:
func MapInitByLiteral(){
m:= map[string] int{
"apple": 2,
"banana" : 3,
}
for k,v:=range m{
fmt.Printf("%s-%d\n" , k,v)
}
}
内置函数make()初始化:
func main() {
m := make(map[string]int, 10)
m["apple"] = 2
m["banana"] = 3
for k , v := range m{
fmt.Printf("%s-%d\n",k,v)
}
}
使用make()函数初始化时,可以指定map的容量(也可以不指定)。指定容量可以有效地减少内存分配的次数,有效的利用应用性能。
2)map的增删改查操作
func main() {
m := make(map[string]int, 10)
m["apple"] = 2 // 添加操作
m["banana"] = 3
for k , v := range m{
fmt.Printf("%s-%d\n",k,v)
}
m["apple"] = 3 //修改操作
m["doog"] = 12
delete(m,"apple") //删除操作
v , exist := m["doog"] //查询操作
if exist{
fmt.Printf("doog - v=%d\n",v)
}
}
删除元素使用内置函数delete()完成,,delete()没有返回值,在map为nil或指定的键不存在的情况下,delete ()也不会报错,相当于空操作。
在查询操作中,最多可以给两个变量赋值,第一个为值,第二个为bool类型的变量,用于指示是否存在指定的键,如果键不存在,那么第一个值为相应类型的零值。如果只指定一个变量,那么该变量仅表示该键对应的值,如果键不存在,那么该值同样为相应类型的零值。
内置函数len()可以查询map的长度,该长度反映map中存储的键值对数。
初始化map时推荐使用内置函数make ()并指定预估的容量。
修改键值对时,需要先查询指定键是否存在,否则 map将创建新的键值对。
查询键值对时,最好检查键是否存在,避免操作零值。
避免并发读写map,如果需要并发读写,则可以使用额外的锁(互斥锁、读写锁),也可以考虑使用标准库sync包中的sync.Map。