10.2 创建并发访问 Creating map for concurrent access

创建并发访问映射
原始的地图在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的当前状态协同工作,因此如果在运行范围方法中更改值,则反映了更改,但前提是尚未访问密钥。范围函数只访问它的键一次。
原文地址:https://www.cnblogs.com/zrdpy/p/8655045.html