天天看點

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 main

import (
    "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"))

}
           

參考文章:

1)

https://blog.csdn.net/champly/article/details/77622328

2)

https://segmentfault.com/a/1190000010294041

繼續閱讀