Go 1.9 sync.Map

choubou發表於2021-09-09

原生的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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章