是线程不安全的 map,多个线程同时访问这个类型的 map 的同一个变量时,会有读写冲突,会导致系统奔溃
map 的底层结构也是一个指针,并不是声明后立刻能够使用。和切片相同,需要使用make()函数进行初始化。在初始化之前为空,没有零值。
package main
import "fmt"
func main() {
var m map[string]string
fmt.Println(m == nil)
m = make(map[string]string)
fmt.Println(m == nil)
}
true
false
使用:=使map在定义的时候直接赋值
使用map[key]=value的形式对map进行赋值
package main
import "fmt"
func main() {
m1 := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
fmt.Println(m1["Apple"])
m2 := make(map[string]string)
m2["Apple"] = "苹果"
m2["Orange"] = "橘子"
m2["Banana"] = "香蕉"
fmt.Println(m2["Apple"])
}
苹果
苹果
使用了一个叫做range的关键字,配合for循环结构来对map结构进行遍历
package main
import "fmt"
func main() {
m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
for k, v := range m {
fmt.Println("key:", k, ", value:", v)
}
}
key: Banana , value: 香蕉
key: Apple , value: 苹果
key: Orange , value: 橘子
函数delete(map,key)来移除 map 中的 key 和 value
package main
import "fmt"
func main() {
m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
fmt.Println(m)
delete(m, "Apple")
fmt.Println(m)
}
map[Apple:苹果 Banana:香蕉 Orange:橘子]
map[Banana:香蕉 Orange:橘子]
自带原子锁,保障了多线程的数据安全
创建不需要make,直接声明就可以使用,它底层的实现并不是指针,是一种多个变量的聚合类型,是结构体
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
fmt.Println(m)
}
{{0 0} {<nil>} map[] 0}
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
m.Store("Apple", "苹果")
m.Store("Orange", "橘子")
m.Store("Banana", "香蕉") //使用 Store 方法给 m 赋值
tmp, exist := m.Load("Orange") //使用 Load 取出 “Orange” 对应的值,如果不存在 “Orange” 这个 key,exist 的值为 false
fmt.Println(tmp, exist)
m.Delete("Banana") //删除 m 中的 “Banana” 和其对应的 value
m.Range(func(k, v interface{}) bool { //使用 Range 方法遍历 m
fmt.Println("key:", k, ", value:", v)
return true
})
}
橘子 true
key: Apple , value: 苹果
key: Orange , value: 橘子
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。