创建并发访问映射
原始的地图在Golang应被视为不安全的并发访问。在前面的方法中,我们描述了如何使用互斥来同步对资源的访问,这也可以利用对图元的访问。但是GO标准库还提供了为并发访问而设计的映射结构。这个食谱将说明如何使用它。
package main
import (
"fmt"
"sync"
)
var names = []string{"Alan", "Joe", "Jack", "Ben",
"Ellen", "Lisa", "Carl", "Steve", "Anton", "Yo"}
func main() {
m := sync.Map{}
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go func(idx int) {
m.Store(fmt.Sprintf("%d", idx), names[idx])
wg.Done()
}(i)
}
wg.Wait()
v, ok := m.Load("1")
if ok {
fmt.Printf("For Load key: 1 got %v
", v)
}
v, ok = m.LoadOrStore("11", "Tim")
if !ok {
fmt.Printf("Key 11 missing stored val: %v
", v)
}
m.Range(func(k, v interface{}) bool {
key, _ := k.(string)
t, _ := v.(string)
fmt.Printf("For index %v got %v
", key, t)
return true
})
}
/*
For Load key: 1 got Joe
Key 11 missing stored val: Tim
For index 5 got Lisa
For index 3 got Ben
For index 0 got Alan
For index 1 got Joe
For index 11 got Tim
For index 9 got Yo
For index 7 got Steve
For index 4 got Ellen
For index 8 got Anton
For index 2 got Jack
For index 6 got Carl
*/
包同步,包含结构图,该结构图设计为同时从多个GO例程中使用。map结构及其方法模拟了图元的行为。存储方法相当于m(键= =)语句。加载方法等于K,OK = m(键)和范围方法提供迭代遍历地图的能力。请注意,范围函数与map的当前状态协同工作,因此如果在运行范围方法中更改值,则反映了更改,但前提是尚未访问密钥。范围函数只访问它的键一次。