Go sync.Map{} 的使用场景和代码示范

6 min read

Go 的 sync 包提供了一些并发安全的数据结构,其中包括 sync.Map{}。该结构是一个并发安全的哈希表,具有以下特点:

  1. 读取和写入操作都是并发安全的,不需要加锁。
  2. 在多个 goroutine 进行并发写入时,插入顺序和读取顺序不一定相同。
  3. 在多个 goroutine 进行并发写入和读取时,保证每个键值对的最终结果是正确的。

sync.Map{} 的使用场景包括:

  1. 并发访问一个全局的哈希表。
  2. 在多个 goroutine 中共享一个缓存。

下面是 sync.Map{} 的代码示例:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var m sync.Map

	// 添加键值对
	m.Store("A", 1)
	m.Store("B", 2)
	m.Store("C", 3)

	// 读取键值对
	v, ok := m.Load("A")
	if ok {
		fmt.Println("A:", v)
	}

	// 删除键值对
	m.Delete("B")

	// 遍历所有键值对
	m.Range(func(k, v interface{}) bool {
		fmt.Println(k, v)
		return true
	})
}

上面的代码首先创建一个新的 sync.Map{},然后使用 Store() 方法添加三个键值对。接着使用 Load() 方法读取键 "A" 对应的值,并判断该键是否存在。然后使用 Delete() 方法删除键 "B"。最后使用 Range() 方法遍历所有的键值对,并打印出来。

以上示例代码中,所有的操作都是并发安全的,不需要加锁。注意,使用 sync.Map{} 的 Load、Store、Delete 和 Range 方法时不能使用普通的 map 对象或并发访问会发生竞争。