欢迎访问宙启技术站
智能推送

Go中Sync.Map的知识点有哪些

发布时间:2023-05-16 18:33:05

Sync.Map 是 Go 语言标准库中提供的一个并发安全的 Map 实现,可以在并发环境下安全地进行读写操作。下面我们来介绍 Sync.Map 的知识点。

1. Map 基础知识

在介绍 Sync.Map 之前,我们需要先了解 Map 的基本使用方法。Map 是一种无序的键值对集合,使用键来检索值。键必须是 的,但值可以重复。Map 使用 make 函数创建,它的语法如下:

mapName := make(map[keyType]valueType)

其中,keyType 是键类型,valueType 是值类型,mapName 是 Map 的名称。如下示例代码创建了一个 Map,以字符串为键,以整数为值:

employeeSalary := make(map[string]int)
employeeSalary["jerry"] = 15000
employeeSalary["tom"] = 20000
employeeSalary["lucy"] = 30000
fmt.Println("Employee Salary Map Contents:", employeeSalary)

输出结果如下:

Employee Salary Map Contents: map[jerry:15000 lucy:30000 tom:20000]

我们可以根据键来获取值,如果该键不存在,会返回值类型的默认值,如下所示:

fmt.Println("Salary of tom is", employeeSalary["tom"])
fmt.Println("Salary of peter is", employeeSalary["peter"])

输出结果如下:

Salary of tom is 20000
Salary of peter is 0

2. Sync.Map 的使用方法

Sync.Map 是 Go 语言提供的一种并发安全的 Map 实现,它的语法如下:

var mapName sync.Map

Sync.Map 的特点是支持并发安全读写操作,而且支持任意类型的键和值。下面我们来看一下 Sync.Map 的常用方法。

2.1 Store() 方法

Store() 方法用于向 Map 中添加新的键值对,它的语法如下:

func (m *Map) Store(key, value interface{})

其中,key 是键的值,value 是对应的值,两个参数都是 interface{} 类型,可以是任意类型。

下面是一个示例代码,使用 Store() 方法向 Sync.Map 中添加元素:

var employeeSalary sync.Map
employeeSalary.Store("jerry", 15000)
employeeSalary.Store("tom", 20000)
employeeSalary.Store("lucy", 30000)

可以通过 Load() 方法来读取元素的值:

salary, ok := employeeSalary.Load("jerry")
if ok {
    fmt.Println("Salary of jerry is", salary)
}

输出结果如下:

Salary of jerry is 15000

2.2 Load() 方法

Load() 方法用于从 Map 中读取键对应的值,它的语法如下:

func (m *Map) Load(key interface{}) (value interface{}, ok bool)

其中,key 是要查找的键的值,返回值 value 是键对应的值,ok 表示该键是否存在。

2.3 Delete() 方法

Delete() 方法用于删除 Map 中的元素,它的语法如下:

func (m *Map) Delete(key interface{})

其中,key 是要删除的键的值。

下面是一个示例代码,使用 Delete() 方法删除 Sync.Map 中的元素:

employeeSalary.Delete("jerry")
fmt.Println("Employee Salary Map Contents after deletion:", employeeSalary)

输出结果如下:

Employee Salary Map Contents after deletion: {{tom 20000} {lucy 30000}}

2.4 Range() 方法

Range() 方法用于遍历 Map,它的语法如下:

func (m *Map) Range(f func(key, value interface{}) bool)

其中,f 是一个函数类型,它用于处理每个元素,接收两个参数,分别是元素的键和值。Range() 方法会按顺序遍历 Sync.Map 中的所有元素,并依次调用 f 函数处理每个元素。

下面是一个示例代码,使用 Range() 方法遍历 Sync.Map 中的元素:

fmt.Println("All Employee Salaries:")
employeeSalary.Range(func(key, value interface{}) bool {
    fmt.Println(key, "==>", value)
    return true
})

输出结果如下:

All Employee Salaries:
tom ==> 20000
lucy ==> 30000

2.5 LoadOrStore() 方法

LoadOrStore() 方法用于获取键对应的值,如果键不存在,则向 Map 中添加一个新的键值对,它的语法如下:

func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)

其中,key 是要查找的键的值,value 是对应的值,actual 表示键对应的值,loaded 表示该键是否已存在,如果已存在则返回 true。

下面是一个示例代码,使用 LoadOrStore() 方法向 Sync.Map 中添加元素:

salary, ok := employeeSalary.LoadOrStore("tom", 20000)
fmt.Println("Salary of tom loaded from memory:", salary, "Status:", ok)

salary, ok = employeeSalary.LoadOrStore("peter", 40000)
fmt.Println("Salary of peter loaded from memory:", salary, "Status:", ok)

输出结果如下:

Salary of tom loaded from memory: 20000 Status: true
Salary of peter loaded from memory: 40000 Status: false

3. 总结

Sync.Map 是 Go 语言提供的一种并发安全的 Map 实现,它的特点是支持并发安全读写操作,而且支持任意类型的键和值。Sync.Map 提供了 Store()、Load()、Delete()、Range() 和 LoadOrStore() 等常用方法,可以方便地操作 Map 元素。