欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go使用sync.Map來解決map的并發(fā)操作問題

 更新時間:2021年10月31日 10:27:52   作者:新亮筆記  
在 Golang 中 map 不是并發(fā)安全的,sync.Map 的引入確實解決了 map 的并發(fā)安全問題,本文就詳細的介紹一下如何使用,感興趣的可以了解一下

前言

在 Golang 中 map 不是并發(fā)安全的,自 1.9 才引入了 sync.Map ,sync.Map 的引入確實解決了 map 的并發(fā)安全問題,不過 sync.Map 卻沒有實現 len() 函數,如果想要計算 sync.Map 的長度,稍微有點麻煩,需要使用 Range 函數。

map 并發(fā)操作出現問題

func main() {
 demo := make(map[int]int)

 go func() {
  for j := 0; j < 1000; j++ {
   demo[j] = j
  }
 }()

 go func() {
  for j := 0; j < 1000; j++ {
   fmt.Println(demo[j])
  }
 }()

 time.Sleep(time.Second * 1)
}

執(zhí)行輸出:

fatal error: concurrent map read and map write

sync.Map 解決并發(fā)操作問題

func main() {
 demo := sync.Map{}

 go func() {
  for j := 0; j < 1000; j++ {
   demo.Store(j, j)
  }
 }()

 go func() {
  for j := 0; j < 1000; j++ {
   fmt.Println(demo.Load(j))
  }
 }()

 time.Sleep(time.Second * 1)
}

執(zhí)行輸出:
<nil> false
1 true

...

999 true

計算 map 長度

func main() {
 demo := make(map[int]int)

 for j := 0; j < 1000; j++ {
  demo[j] = j
 }

 fmt.Println("len of demo:", len(demo))
}

執(zhí)行輸出:
len of demo: 1000

計算 sync.Map 長度

func main() {
 demo := sync.Map{}
 
 for j := 0; j < 1000; j++ {
  demo.Store(j, j)
 }

 lens := 0
 demo.Range(func(key, value interface{}) bool {
  lens++
  return true
 })

 fmt.Println("len of demo:", lens)
}

執(zhí)行輸出:
len of demo: 1000

小結

  • Load 加載 key 數據
  • Store 更新或新增 key 數據
  • Delete 刪除 key 數據
  • Range 遍歷數據
  • LoadOrStore 如果存在 key 數據則返回,反之則設置
  • LoadAndDelete 如果存在 key 數據則刪除

到此這篇關于Go使用sync.Map來解決map的并發(fā)操作問題的文章就介紹到這了,更多相關Go sync.Map解決map并發(fā)操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go基本數據類型與string類型互轉

    Go基本數據類型與string類型互轉

    本文主要介紹了Go基本數據類型與string類型互轉,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • go實現冒泡排序的示例代碼

    go實現冒泡排序的示例代碼

    這篇文章主要介紹了go實現冒泡排序的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • golang 實現菜單樹的生成方式

    golang 實現菜單樹的生成方式

    這篇文章主要介紹了golang 實現菜單樹的生成方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 手把手教你用VS?code快速搭建一個Golang項目

    手把手教你用VS?code快速搭建一個Golang項目

    Go語言是采用UTF8編碼的,理論上使用任何文本編輯器都能做Go語言開發(fā),下面這篇文章主要給大家介紹了關于使用VS?code快速搭建一個Golang項目的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Golang語言學習拿捏Go反射示例教程

    Golang語言學習拿捏Go反射示例教程

    這篇文章主要為大家介紹了Golang語言中Go反射示例的教程,教你拿捏Go反射,再也不用被Go反射折磨,有需要的朋友可以共同學習參考下
    2021-11-11
  • 淺析GO語言的垃圾回收機制

    淺析GO語言的垃圾回收機制

    今天我們來聊聊golang是如何進行垃圾回收的,我們知道,目前各語言進行垃圾回收的方法有很多,如引用計數、標記清除、分代回收、三色標記等,各種方式都有其特點,文中介紹的非常詳細,感興趣的小伙伴跟著小編一起學習吧
    2023-07-07
  • 詳解Go程序添加遠程調用tcpdump功能

    詳解Go程序添加遠程調用tcpdump功能

    這篇文章主要介紹了go程序添加遠程調用tcpdump功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Go語言使用釘釘機器人推送消息的實現示例

    Go語言使用釘釘機器人推送消息的實現示例

    本文主要介紹了Go語言使用釘釘機器人推送消息的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Golang中的time.Duration類型用法說明

    Golang中的time.Duration類型用法說明

    這篇文章主要介紹了Golang中的time.Duration類型用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Golang中的交叉編譯

    詳解Golang中的交叉編譯

    在 Golang 中,交叉編譯指的是在同一臺機器上生成針對不同操作系統(tǒng)或硬件架構的二進制文件,這在開發(fā)跨平臺應用或構建特定平臺的發(fā)布版本時非常有用,本文就詳細的給大家介紹一下Golang中的交叉編譯,需要的朋友可以參考下
    2023-08-08

最新評論