章节

11.3 sync.Map

本篇学习 sync.Map 的 Store、Load、Delete 与 Range,并能在并发场景中安全使用 map。

sync.Map

概念说明

普通 map 不支持并发读写。
如果多个 goroutine 同时读写普通 map,可能出现数据竞争,严重时会直接触发运行时错误。

sync.Map 是标准库提供的并发安全 map。
它适合读多写少、键集合相对稳定等场景。

语法/规则

  1. 使用 Store(key, value) 写入数据。
  2. 使用 Load(key) 读取数据,返回 value, ok
  3. 使用 Delete(key) 删除数据。
  4. 使用 Range(func(key, value any) bool) 遍历数据。
  5. Range 返回 false 表示停止遍历。
  6. 如果需要强类型和复杂一致性,普通 map 加锁可能更清晰。

sync.Map 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
	"fmt"
	"sync"
)

func main() {
	var users sync.Map // 声明一个并发安全的 map

	users.Store("name", "abin") // 写入一组键值对
	users.Store("age", 21)      // 再写入一组键值对

	name, ok := users.Load("name") // 读取 key 为 "name" 的值
	fmt.Println(name, ok)          // ok 表示这个 key 是否存在

	users.Range(func(key, value any) bool { // 遍历 sync.Map 中的所有键值对
		fmt.Println(key, value)
		return true // 返回 true 表示继续遍历
	})
}

输出结果(遍历顺序可能不同):

1
2
3
abin true
name abin
age 21

常见错误

  1. 并发读写普通 map,可能触发 fatal error: concurrent map writes
  2. 忘记 Load 返回的是 any,使用具体类型前需要断言。
  3. 以为 Range 遍历顺序固定,实际不要依赖顺序。
  4. 在所有场景都使用 sync.Map,忽略普通 map 加锁可能更简单。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字