如何合并两张地图?

新手上路,请多包涵

我有一个递归函数,它创建表示文件路径的对象(键是路径,值是关于文件的信息)。它是递归的,因为它仅用于处理文件,因此如果遇到目录,则会在目录上递归调用该函数。

综上所述,我想在两个地图上做一个集合并集的等效操作(即“主”地图用递归调用的值更新)。除了迭代一个地图并将其中的每个键和值分配给另一个地图中的同一事物之外,是否有一种惯用的方法来做到这一点?

That is: given a,b are of type map [string] *SomeObject , and a and b are eventually populated, is there any way to update a 所有值都在 b 中?

原文由 jeffknupp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 528
2 个回答

没有内置的方式,也没有标准包中的任何方法来进行这样的合并。

惯用的方法是简单地迭代:

 for k, v := range b {
    a[k] = v
}

原文由 ANisus 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 Go 1.18 开始,您可以简单地使用 golang.org/x/exp/maps 包中的 Copy 函数

 package main

import (
    "fmt"

    "golang.org/x/exp/maps"
)

func main() {
    src := map[string]int{
        "one": 1,
        "two": 2,
    }
    dst := map[string]int{
        "two":   2,
        "three": 3,
    }
    maps.Copy(dst, src)
    fmt.Println("src:", src)
    fmt.Println("dst:", dst)
}

游乐场

输出:

 src: map[one:1 two:2]
dst: map[one:1 three:3 two:2]


这种方法的一个警告是您的地图的键类型必须是 具体 的,即不是接口类型。例如,编译器不允许您将类型 map[io.Reader]int 的值传递给 Copy 函数:

 package main

import (
    "fmt"
    "io"

    "golang.org/x/exp/maps"
)

func main() {
    var src, dst map[io.Reader]int
    maps.Copy(dst, src)
    fmt.Println("src:", src)
    fmt.Println("dst:", dst)
}

游乐场

编译器输出:

 go: finding module for package golang.org/x/exp/maps
go: downloading golang.org/x/exp v0.0.0-20220328175248-053ad81199eb
./prog.go:12:11: io.Reader does not implement comparable

Go build failed.

有关 提案中此限制的更多信息:spec: permit values to have type “comparable”

原文由 jub0bs 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题