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 會有更好的性能
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56900.html
標籤:Go
下一篇:Go語言nil:空值/零值
