Golang Go语言中 sync.Map 不能方便的修改元素某值

发布于 1周前 作者 wuwangju 来自 Go语言

Golang Go语言中 sync.Map 不能方便的修改元素某值

有别的类型可以替代么?实现类似下面的功能

tmp,_ := testlist.Load(2)
tmp.(UserInfo).Name = "test55"
9 回复

仅限于这两行代码,先想想有没有并发问题

更多关于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主要用于高并发环境下的读写操作,提供了StoreLoadLoadOrStoreDeleteRange等操作方法,但这些方法主要处理的是整个键值对的存储和加载,而不支持对值的部分字段进行更新。

如果需要修改sync.Map中某个值的字段,通常的做法是先通过LoadLoadOrStore方法获取到值,然后在值上进行修改,最后再通过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)
    }
}

在并发环境中,这种方法可能需要结合其他同步机制(如互斥锁)来确保数据一致性。如果并发修改非常频繁,可能需要考虑使用更复杂的并发数据结构或算法来优化性能。

回到顶部