登录
首页 >  Golang >  Go问答

使用 Golangsync.Map 以及切片进行操作

来源:stackoverflow

时间:2024-03-13 19:51:27 165浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《使用 Golangsync.Map 以及切片进行操作》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

为了调试一些并发问题,我正在将部分代码从处理常规 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 可以为零。即使您首先检查并加载,如果有人从另一个 goroutine 的映射中删除该键,您可能会在这里得到 nil 。

第二个错误又是类型不匹配:值已经是一个 int 数组,所以:

sync_map.Store(cur_h, value)

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

今天关于《使用 Golangsync.Map 以及切片进行操作》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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