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