我的Golang应用程序中有几个Actor需要两个映射来完成它们的工作。这些映射是由一些密集的数据库事务生成的,所以我不想在每个参与者中都这样做,因此我将映射生成与参与者分离。
这种方法的问题是,如果我将这些地图传递给其中的每一个,它们就会通过引用传递,这会在我同时写作和阅读时引起恐慌。
我的解决方案是,每次将这些地图传递给新的Actor时,都对其进行Marshal和Unmarshal处理,但我想知道是否有更好的解决方案。
在循环中复制映射会更便宜。基准是肯定的。去游乐场
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
}