使用
• Store 写入
• Load 读取,返回值有两个,第一个是value,第二个是bool变量表示key是否存在
• Delete 删除
• LoadOrStore 存在就读,不存在就写
• Range 遍历,表示对所有key进行遍历,并将遍历出的key,value传入回调函数进行函数调用,回调函数返回false时遍历结束,否则遍历完所有key.
package main
import (
"fmt"
"sync"
)
// 遍历时删除所有的偶数,结果:确实删除了所有的偶数
func fun1() {
x := sync.Map{
}
// 构建
for i := 0; i < 100; i++ {
x.Store(i, i)
}
// 遍历时删除偶数
x.Range(func(k, v interface{
}) bool {
if k.(int)%2 == 0 {
x.Delete(k)
}
return true
})
// 遍历打印剩下的
cout := 0
x.Range(func(k, v interface{
}) bool {
fmt.Println(k, v)
cout++
return true
})
// 会发现是50个,说明删除了所有的偶数
fmt.Println("删除偶数后,剩余元素数,cout:", cout)
}
// 遍历时删除所有元素,结果:确实删除了所有的元素
func fun2() {
x := sync.Map{
}
// 构建
for i := 0; i < 100; i++ {
x.Store(i, i)
}
// 遍历时删除偶数
x.Range(func(k, v interface{
}) bool {
x.Delete(k)
return true
})
// 遍历打印剩下的
cout := 0
x.Range(func(k, v interface{
}) bool {
fmt.Println(k, v)
cout++
return true
})
// 会发现是0个,说明删除了所有的元素
fmt.Println("全部删除后,剩余元素数,cout:", cout)
}
func main() {
// 遍历时删除一半
fun1()
// 遍历时删除所有元素
fun2()
}
//通过userId查ws
func (r *Game) FindSocketByUserID(userId int) *websocket.Conn {
var ws *websocket.Conn
r.m_UserList.Range(func(k, v interface{
}) bool {
switch v.(type) {
case *websocket.Conn:
userId_k := k.(int)
if userId == userId_k {
ws = v.(*websocket.Conn)
return false//返回false表示停止遍历
}
}
return true //返回true表示继续遍历
})
return ws
}
//添加用户列表
func (r *Game) AddUserList(userId int, ws *websocket.Conn) {
if vv, ok := r.m_UserList.LoadOrStore(userId, ws); ok {
fmt.Println("添加游戏用户列表:", vv)
}
base.Logger.Infof("添加游戏用户列表:", r.M_RoomID, userId)
}
//删除用户列表
func (r *Game) DelUserList(userId int) {
r.m_UserList.Delete(userId)
base.Logger.Infof("删除游戏用户列表:", r.M_RoomID, userId)
}
原理分析
https://www.yuque.com/lixin-fjgsf/auiwcw/slhgcz