gpt4 book ai didi

go - 使用 Slices 和 Golang sync.Map 结构

转载 作者:行者123 更新时间:2023-12-01 22:44:35 83 4
gpt4 key购买 nike

为了调试一些并发问题,我正在将部分代码从处理常规 Golang 映射切换到处理 sync.Map。但是,当我尝试运行我的新代码时,我遇到了两个我不确定如何调试的错误。

原始代码块:

        sync_mutex.Lock()
if _, ok := the_map[cur_h]; ok {

the_map[cur_h] = append(the_map[cur_h], cur_id)

} else {

value := []int{cur_id}
the_map[cur_h] = value

}
sync_mutex.Unlock()

新代码块:
if _, ok := sync_map.Load(cur_h); ok {
sync_mutex.Lock()
cur_slice, _ := sync_map.Load(cur_h)
updtd_slice := append(cur_slice, cur_id) // error #1

sync_map.Store(cur_h, updtd_slice)
map_mutex.Unlock()

} else {
map_mutex.Lock()
value := []int{cur_id}
sync_map.Store(cur_h, []int{value}) // error #2
sync_mutex.Unlock()

}

被抛出的错误是:
... first argument to append must be slice; have interface {}
... cannot use value (type []int) as type int in array or slice literal

最佳答案

sync_map.Load返回 interface{} ,这就是你得到第一个错误的原因。您必须使用类型断言来获取基础类型:

cur_slice_i, _ := sync_map.Load(cur_h)
cur_slice := cur_slice_i.([]int)
updtd_slice := append(cur_slice, cur_id)

不是上面那个,cur_slice_i 可以是 nil。即使您首先检查并加载,如果有人在另一个 goroutine 中从映射中删除该键,您可能会在这里得到 nil。

第二个错误再次是类型不匹配: value 已经是一个 int 数组,所以:
sync_map.Store(cur_h, value)

您第一次使用带有互斥锁的 map 是正确的。如果您在访问该映射的所有其他 goroutine 中使用相同的模式,那么您不应该遇到与并发访问映射相关的问题。

关于go - 使用 Slices 和 Golang sync.Map 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59299470/

83 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com