Go 1.9 sync.Map
原生的map在沒有加鎖的情況下用於協程是資料不安全,並且因為不安全,在編譯的時候編譯器也會報錯。
如果要在多個協程中使用同一個map變數,則需要自己進行加解鎖操作。
在Go 1.9中,標準庫中加入了協程安全的map,這個sync.Map有以下這個公開的方法:
Store
LoadOrStore
Load
Delete
Range
下面分別介紹下這幾個方法的用法,其實現原理也在最後面給出相應的原理。
(1)Store(key, value interface{})
說明:儲存一個設定的鍵值。
(2)LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
說明:存在則返回原值, true,不寫入傳入值。不存在則存入,並返回最新值和false
(3)Load(key interface{}) (value interface{}, ok bool)
說明:讀取儲存在map中的值,如果沒有nil,則返回nil。OK的結果表示是否是map中找到值。
(4)Delete(key interface{})
說明:刪除鍵對應的值。
(5)Range(f func(key, value interface{}) bool)
說明:迴圈讀取map中的值
簡單使用:
package mainimport ( "sync" "fmt")func main() { // 1)定義一個sync.Map變數 var m sync.Map // 2)儲存到m中 m.Store("k", "123") m.Store("k12", "dsad") m.Store("dsa", "dasd") m.Store("hel", "dsawe231") fmt.Println(m) // 3)讀取m中內容 val, err := m.Load("k") fmt.Println(val, err) // 4)刪除m中內容 m.Delete("k") val, err = m.Load("k") fmt.Println(val, err) // 5)遍歷 m.Range(func(key, value interface{}) bool { // 返回true則繼續,返回false則停止 fmt.Println(key, value) return true }) // 6)存在則返回原值, true,不寫入傳入值。不存在則存入,並返回最新值和false m.Store("val", 123) fmt.Println(m.LoadOrStore("val", "abc")) fmt.Println(m.Load("val")) fmt.Println(m.LoadOrStore("val", "abc123")) }
作者:laijh
連結:https://www.jianshu.com/p/c91685af8ba6
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2819970/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go1.9sync.MapGo
- go sync.Map原始碼分析Go原始碼
- Go sync.Map 看一看Go
- 深度解密 Go 語言之 sync.map解密Go
- Go語言——sync.Map原始碼分析Go原始碼
- Go 併發讀寫 sync.map 的強大之處Go
- 1.9
- Go實踐:用Sync.Map實現簡易記憶體快取系統Go記憶體快取
- sync.Map原始碼分析原始碼
- [Golang併發]Sync.mapGolang
- 深入理解golang:sync.mapGolang
- Goland sync.Map大白話解析GoLand
- Flutter | 1.9 全新元件 ToggleButtonsFlutter元件
- DVWA-1.9之fileupload
- 踩了 Golang sync.Map 的一個坑Golang
- 1.9 - Laravel - 5.6 - tag 解析機制Laravel
- 真希望你也明白runtime.Map和sync.Map
- 1.9 靜態頁面佈局例項
- 將 flutter_web 遷移到 flutter1.9+FlutterWeb
- 上週熱點回顧(1.3-1.9)
- 上週熱點回顧(1.9-1.15)
- concurrent-map 和 sync.Map,我該選擇哪個?
- Nomad跨鏈協議被黑走1.9億美元協議
- PowerJob 從 0 到 1.9k star 的經歷
- Github 1.9K Star的資料治理框架-AmundsenGithub框架
- 不得不知道的Golang之sync.Map原始碼分析Golang原始碼
- ArcGIS Earth1.9最新版安裝和使用教程
- Java入門第三季1.9圖書查詢Java
- kubernetes1.9原始碼閱讀 List-Watch及Reflec原始碼
- 福布斯:2020年全球億萬富翁財富增加1.9萬億美元
- Flink 1.9 實戰:使用 SQL 讀取 Kafka 並寫入 MySQLKafkaMySql
- Harbor1.9+Nginx高可用叢集倉庫搭建筆記Nginx筆記
- Golang map執行緒安全實現及sync.map使用及原理解析。Golang執行緒
- TensorFlow 1.9迎來優化版,詳細效能更新干貨分享!優化
- Flutter1.9升級體驗總結(幫大家填坑了)Flutter
- f1.9光圈為什麼比f2.2光圈還大
- 2019年4月德國工業生產環比下降1.9%
- kubernetes1.9原始碼閱讀 kubelet對pod資源的wat原始碼