1. 程式人生 > >go的sync.Map

go的sync.Map

amp pre 技術分享 源碼解析 解析 false div 類型 揭秘

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

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

它主要五個方法及其功能簡介:

1、Store 存 key,value

2、LoadOrStore 取&存-具體看代碼

3、Load 取key對應的value

4、Range 遍歷所有的key,value

5、Delete 刪除key,及其value

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)) }

技術分享圖片

go的sync.Map