日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的sync.Map

發(fā)布時(shí)間:2025/6/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的sync.Map 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Go 語言中的 map 在并發(fā)情況下,只讀是線程安全的,同時(shí)讀寫線程不安全。

下面來看下并發(fā)情況下讀寫 map 時(shí)會(huì)出現(xiàn)的問題,代碼如下:

package mainfunc main() {//創(chuàng)建一個(gè)int到int映射m := make(map[int]int)//開啟一段并發(fā)代碼go func() {//不停對(duì)map進(jìn)行寫入for {m[1] = 1}}()//開啟一段并發(fā)代碼go func() {//不停對(duì)map進(jìn)行讀取for {_ = m[1]}}()for {;} }

運(yùn)行代碼會(huì)報(bào)錯(cuò),輸出如下:

fatal error: concurrent map read and map write

運(yùn)行時(shí)輸出提示:并發(fā)的 map 讀寫。也就是說使用了兩個(gè)并發(fā)函數(shù)不斷地對(duì) map 進(jìn)行讀和寫而發(fā)生了競態(tài)問題。map 內(nèi)部會(huì)對(duì)這種并發(fā)操作進(jìn)行檢查并提前發(fā)現(xiàn)。

需要并發(fā)讀寫時(shí),一般的做法是加鎖,但這樣性能并不高。Go 語言在 1.9 版本中提供了一種效率較高的并發(fā)安全的 sync.Map。sync.Map 和 map 不同,不是以語言原生形態(tài)提供,而是在 sync 包下的特殊結(jié)構(gòu)。

sync.Map有以下特性:

  • 無須初始化,直接聲明即可。
  • sync.Map 不能使用 map 的方式進(jìn)行取值和設(shè)置等操作,而是使用 sync.Map 的方法進(jìn)行調(diào)用。Store 表示存儲(chǔ),Load 表示獲取,Delete 表示刪除。
  • 使用 Range 配合一個(gè)回調(diào)函數(shù)進(jìn)行遍歷操作,通過回調(diào)函數(shù)返回內(nèi)部遍歷出來的值。Range 參數(shù)中的回調(diào)函數(shù)的返回值功能是:需要繼續(xù)迭代遍歷時(shí),返回 true;終止迭代遍歷時(shí),返回 false。
package mainimport ("fmt""sync" )func main() {var scene sync.Map// 將鍵值對(duì)保存到sync.Mapscene.Store("greece", 97)scene.Store("london", 100)scene.Store("egypt", 200)// 從sync.Map中根據(jù)鍵取值fmt.Println(scene.Load("london"))// 根據(jù)鍵刪除對(duì)應(yīng)的鍵值對(duì)scene.Delete("london")// 遍歷所有sync.Map中的鍵值對(duì)scene.Range(func(k, v interface{}) bool {fmt.Println("iterate:", k, v)return true})}

代碼輸出如下:

100 true iterate: egypt 200 iterate: greece 97

代碼說明如下:

  • 第 10 行,聲明 scene,類型為 sync.Map。注意,sync.Map 不能使用 make 創(chuàng)建。
  • 第 13~15 行,將一系列鍵值對(duì)保存到 sync.Map 中,sync.Map 將鍵和值以 interface{} 類型進(jìn)行保存。
  • 第 18 行,提供一個(gè) sync.Map 的鍵給 scene.Load() 方法后將查詢到鍵對(duì)應(yīng)的值返回。
  • 第 21 行,sync.Map 的 Delete 可以使用指定的鍵將對(duì)應(yīng)的鍵值對(duì)刪除。
  • 第 24 行,Range() 方法可以遍歷 sync.Map,遍歷需要提供一個(gè)匿名函數(shù),參數(shù)為 k、v,類型為?interface{},每次 Range() 在遍歷一個(gè)元素時(shí),都會(huì)調(diào)用這個(gè)匿名函數(shù)把結(jié)果返回。

sync.Map 沒有提供獲取 map 數(shù)量的方法,替代方法是獲取時(shí)遍歷自行計(jì)算數(shù)量。sync.Map 為了保證并發(fā)安全有一些性能損失,因此在非并發(fā)情況下,使用 map 相比使用 sync.Map 會(huì)有更好的性能。

總結(jié)

以上是生活随笔為你收集整理的golang中的sync.Map的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。