go的sync.Map

  sync.Map這個數據結構是線程安全的(基本類型Map結構體在併發讀寫時會panic嚴重錯誤),它填補了Map線程不安全的缺陷,不過最好只在須要的狀況下使用。它通常用於併發模型中對同一類map結構體的讀寫,或其餘適用於sync.Map的狀況。segmentfault

關於sync.Map的源碼解析文章:Go 1.9 sync.Map揭祕安全

 

它主要五個方法及其功能簡介:數據結構

 

一、Store   存 key,value併發

 

二、LoadOrStore   取&存-具體看代碼函數

 

三、Load   取key對應的valuespa

 

四、Range   遍歷全部的key,value線程

 

五、Delete   刪除key,及其valuecode

package main
 
import (
    "fmt"
    "sync"
)
 
func main() {
    var m sync.Map
 
    //Store
    m.Store(1,"a")
    m.Store(2,"b")
 
    //LoadOrStore
    //若key不存在,則存入key和value,返回false和輸入的value
    v,ok := m.LoadOrStore("1","aaa")
    fmt.Println(ok,v) //false aaa
 
    //若key已存在,則返回true和key對應的value,不會修改原來的value
    v,ok = m.LoadOrStore(1,"aaa")
    fmt.Println(ok,v) //false aaa
 
    //Load
    v,ok = m.Load(1)
    if ok{
        fmt.Println("it's an existing key,value is ",v)
    } else {
        fmt.Println("it's an unknown key")
    }
 
    //Range
    //遍歷sync.Map, 要求輸入一個func做爲參數
    f := func(k, v interface{}) bool {
        //這個函數的入參、出參的類型都已經固定,不能修改
        //能夠在函數體內編寫本身的代碼,調用map中的k,v
 
            fmt.Println(k,v)
            return true
        }
    m.Range(f)
 
    //Delete
    m.Delete(1)
    fmt.Println(m.Load(1))
 
}

相關文章
相關標籤/搜索