欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sync.Map(在并发环境中使用的map)

程序员文章站 2022-03-21 17:31:37
sync.Map 有以下特性: 需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构。 无须初始化,直接声明即可。 sync.Map ......

sync.map 有以下特性:

需要并发读写时,一般的做法是加锁,但这样性能并不高,go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.map,sync.map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构。

  • 无须初始化,直接声明即可。

  • sync.map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.map 的方法进行调用,store 表示存储,load 表示获取,delete 表示删除。

  • 使用 range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true,终止迭代遍历时,返回 false。

并发安全的 sync.map 演示代码如下:

package main
​
import (
     "fmt"
     "sync"
)
​
func main() {
​
   var scene sync.map
​
   // 将键值对保存到sync.map
   scene.store("greece", 97)
   scene.store("london", 100)
   scene.store("egypt", 200)
​
   // 从sync.map中根据键取值
   fmt.println(scene.load("london"))
​
   // 根据键删除对应的键值对
   scene.delete("london")
​
   // 遍历所有sync.map中的键值对
   scene.range(func(k, v interface{}) bool {
​
       fmt.println("iterate:", k, v)
       return true
  })
​
}

sync.map 没有提供获取 map 数量的方法,替代方法是在获取 sync.map 时遍历自行计算数量,sync.map 为了保证并发安全有一些性能损失,因此在非并发情况下,使用 map 相比使用 sync.map 会有更好的性能

代码输出如下:

100 true

iterate: egypt 200

iterate: greece 97

代码说明如下:

  • 第 10 行,声明 scene,类型为 sync.map,注意,sync.map 不能使用 make 创建。

  • 第 13~15 行,将一系列键值对保存到 sync.map 中,sync.map 将键和值以 interface{} 类型进行保存。

  • 第 18 行,提供一个 sync.map 的键给 scene.load() 方法后将查询到键对应的值返回。

  • 第 21 行,sync.map 的 delete 可以使用指定的键将对应的键值对删除。

  • 第 24 行,range() 方法可以遍历 sync.map,遍历需要提供一个匿名函数,参数为 k、v,类型为 interface{},每次 range() 在遍历一个元素时,都会调用这个匿名函数把结果返回。

sync.map 没有提供获取 map 数量的方法,替代方法是在获取 sync.map 时遍历自行计算数量,sync.map 为了保证并发安全有一些性能损失,因此在非并发情况下,使用 map 相比使用 sync.map 会有更好的性能