Golang Go语言中 sync.Map 不能方便的修改元素某值
Golang Go语言中 sync.Map 不能方便的修改元素某值
有别的类型可以替代么?实现类似下面的功能
tmp,_ := testlist.Load(2)
tmp.(UserInfo).Name = "test55"
仅限于这两行代码,先想想有没有并发问题
更多关于Golang Go语言中 sync.Map 不能方便的修改元素某值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
给自己的 map 加个锁就行吧,你这样写可能还会有竞争
sync.Map 不支持 load 后直接修改,只是示例下。
还有别的方法么?相当于存用户位置,经常改变和读取全部用户位置这样。
没有什么好办法,sync.Map 的适用场景是读多写少,可以看看压测对比,性能没有优势的;你这种需求本身只能拿出来修改
a8m/syncmap 挺好用
存指针就好*UserInfo
如楼上所说,如果是写多的情况不应该使用 sync.map 啊,尝试使用 sync.mutex 吧!
在Go语言的sync.Map
中,直接修改某个已存在元素的某个字段值确实不是其设计初衷。sync.Map
主要用于高并发环境下的读写操作,提供了Store
、Load
、LoadOrStore
、Delete
和Range
等操作方法,但这些方法主要处理的是整个键值对的存储和加载,而不支持对值的部分字段进行更新。
如果需要修改sync.Map
中某个值的字段,通常的做法是先通过Load
或LoadOrStore
方法获取到值,然后在值上进行修改,最后再通过Store
方法将修改后的值存回sync.Map
。这种操作虽然可以实现字段的修改,但需要注意并发控制,因为在获取和存储值之间可能存在其他协程对同一个键进行了操作。
示例代码如下:
var m sync.Map
// 假设值是一个结构体
type MyStruct struct {
Field1 int
Field2 string
}
// 修改Field1的值
func modifyField1(key string, newValue int) {
var val MyStruct
if m.Load(key, &val) {
val.Field1 = newValue
m.Store(key, val)
}
}
在并发环境中,这种方法可能需要结合其他同步机制(如互斥锁)来确保数据一致性。如果并发修改非常频繁,可能需要考虑使用更复杂的并发数据结构或算法来优化性能。