轉自https://blog.csdn.net/sc_lilei/article/details/81390185
簡介:
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))
}