【问题标题】:How to pass a map as value?如何将地图作为值传递?
【发布时间】:2019-05-14 10:34:20
【问题描述】:

我的 Golang 应用程序中有几个 Actor,它们需要两张地图才能完成工作。这些地图是由一些密集的数据库事务生成的,所以我不想在每个演员中都这样做,因此我将地图生成与演员分开。

我在使用这种方法时遇到的问题是,如果我将这些映射传递给它们中的每一个,它们会通过引用传递,这会在我同时写入和读取时引起恐慌。

我对此的解决方案是每次将这些地图传递给新的 Actor 时对这些地图进行元组和解组,但我想知道是否有更好的解决方案。

【问题讨论】:

    标签: go concurrency actor go-map


    【解决方案1】:

    循环复制地图会更便宜。确定基准。 go playground

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        src := map[string]string{`one`: `one1`, `two`: `two1`, `three`: `tree1`}     
        dst := mapClone(src)
        delete(src, `one`)
        fmt.Println(src)
        fmt.Println(dst)
    }
    
    func mapClone(src map[string]string) map[string]string {
        dst := make(map[string]string, len(src))
        for k, v := range src {
            dst[k] = v
        }
        return dst
    }
    

    【讨论】:

    • 如果地图很深,你的函数会传递这些深层值的值吗?
    • 没有。添加您的地图定义。基准编组到 gob。 play.golang.org/p/yuw03aRKLMG
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2020-07-29
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多