登录
首页 >  Golang >  Go问答

有效实现原子计数器在 Go 的地图中的方法

来源:stackoverflow

时间:2024-02-05 23:27:20 148浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《有效实现原子计数器在 Go 的地图中的方法》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我想在map中实现原子计数器(map[string]int64),如何在Go中实现?首先,我不能只使用 int64 作为键,因为我无法在 atomic.AddInt64 函数的映射中获取该值的地址,因为映射不可寻址。其次,当使用 *int64 作为值时,我必须以某种方式预初始化指针的 int 值,但在 if _, ok := myMap[key]; 上初始化。 !ok { myMap[key] = ... } 不起作用,因为它不是原子的,因此需要锁。


正确答案


sync.map 具有适合您的用例的确切方法,即 (*sync.map).loadorstore,如果可以的话,它将加载现有值,否则将给定值存储到地图中。 p>

func UpdateCounter(counters *sync.Map, key string) {
    val, _ := counters.LoadOrStore(key, new(int64))
    ptr := val.(*int64)
    atomic.AddInt64(ptr, 1)
}

这分两步完成:

  • 第一个是将条目规范化。即,无论执行顺序如何,都为相同的键获取相同的条目。 (*sync.map).loadorstore 确保通过原子方式查找地图,如果不存在则放置条目,否则从地图中获取条目。

  • 第二步是在获得规范条目后增加计数器。由于对同一键的所有查找都会返回相同的条目,因此此步骤很简单。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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