首页 > 后端开发 > Golang > 使用'range”对 Go Map 进行并发迭代安全吗?如何实现?

使用'range”对 Go Map 进行并发迭代安全吗?如何实现?

Susan Sarandon
发布: 2024-12-13 17:43:21
原创
673 人浏览过

Is Concurrent Iteration Over Go Maps with `range` Safe, and How Can It Be Achieved?

Go 中使用 Range 并发访问地图

Go 中使用 range 关键字并发访问地图的概念经常被误解。为了澄清这个问题,让我们探讨一下并发访问映射的复杂性以及使用范围的含义。

范围表达式的计算

for 语句中的范围表达式仅在循环之前计算一次开始,排除某些特定场景。对于映射,范围表达式仅指向映射变量。

范围迭代

在范围迭代期间,键和值变量(大多数情况下为 k 和 v)在每次迭代期间保存地图中的值。但是,执行迭代时,for 块内不会发生映射访问。当为下一次迭代设置 k 和 v 值时,就会发生这种情况。

安全并发迭代

理解这些概念,通过使用锁来保护,在映射上执行并发迭代是安全的迭代期间的地图。然而,迭代中的解锁应该作为延迟语句来完成,以处理早期返回。

var testMap = make(map[int]int)
var testMapLock = &sync.RWMutex{}

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    for k, v := range testMap {
        testMapLock.RUnlock()
        someFunc()
        testMapLock.RLock()
        if someCond {
            return someErr
        }
    }
    return nil
}
登录后复制

并发修改

值得注意的是,这种类型的锁定方案只能防止并发访问。它不会阻止其他 goroutine 的并发修改。但是,如果修改受到写锁的保护,它们仍然是安全的,但 for 循环不一定会迭代新的对。

不安全的做法

解锁 for 块中的读锁是不安全的,因为它允许其他 goroutine 修改映射并可能导致竞争条件。

以上是使用'range”对 Go Map 进行并发迭代安全吗?如何实现?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板