登录
首页 >  Golang >  Go问答

如何安全地遍历嵌套映射中的数据?

来源:stackoverflow

时间:2024-02-24 09:15:25 117浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如何安全地遍历嵌套映射中的数据?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我对如何确保对嵌套映射的安全并发访问有点困惑。 最初我的设置是这样的,我意识到我需要能够锁定至少一张地图。

map[string]map[string]dish

经过一番思考,我设想的结构如下所示:

type Manager struct {
    mu sync.RWMutex
    locations map[string]Restaurant
}
type Restaurant struct {
    mu sync.RWMutex
    menu map[string]Dish
}
type Dish struct {
    name string
    price string
    vegan bool
}

我的基本理解如下: 如果我想向 locations 添加新的 restaurant,我需要锁定 manager。 如果我想将 dish 添加或修改为 menu,我需要锁定 restaurant,但我不确定是否也需要锁定 manager。 同样,如果我想从 manager 访问值,我不确定是否也需要锁定 restaurant

我尝试(未成功)在使用 -race 标志时强制数据竞争,所以我不确定是否需要在 restaurant 发生突变时锁定 manager,并且每次访问 manager 时锁定 restaurant 是必要的,或者如果我的尝试强迫比赛是行不通的。


解决方案


首先,您不想复制锁,因此需要使用指针:

type Manager struct {
    mu sync.RWMutex
    locations map[string]*Restaurant
}
type Restaurant struct {
    mu sync.RWMutex
    menu map[string]Dish
}

一旦您拥有 *restaurant 实例,您必须锁定它才能写入 menu,并锁定它才能从 menu 读取。

要通过地图查找来获取餐厅,您需要锁定 manager,并且要向 manager 添加内容,您需要锁定它。

所以如果你想从上到下,你必须先锁定经理,然后锁定餐厅。每当执行此操作时,您还必须确保以相同的顺序锁定它们(首先是经理,然后是餐厅)以避免死锁。

理论要掌握,实操不能落!以上关于《如何安全地遍历嵌套映射中的数据?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>