是否有内置功能去制作任意地图的副本?

时间:2014-04-12 16:33:46

标签: go

是否有内置函数来制作任意地图的副本?

我可以手工编写,但我之前发现当我想对地图进行深入比较时,我正在寻找一个类似的问题,似乎已经内置了一个功能!所以类似地,也许我想知道是否有内置的或一些库或包用于在golang中制作地图的深层副本。我相信我不是第一个想要制作地图副本的人。

副本我的意思是你可以创建两个不同的变量来引用内存中的不同地图,即使它们是相同的内容。

4 个答案:

答案 0 :(得分:8)

要获得更一般的答案,您可以对地图进行编码,并使用encoding/gob将其解码为新变量。

这种方式的优点在于它甚至可以处理更复杂的数据结构,例如包含一片地图的结构片。

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "log"
)

func main() {
    ori := map[string]int{
        "key":  3,
        "clef": 5,
    }

    var mod bytes.Buffer
    enc := gob.NewEncoder(&mod)
    dec := gob.NewDecoder(&mod)

    fmt.Println("ori:", ori) // key:3 clef:5
    err := enc.Encode(ori)
    if err != nil {
        log.Fatal("encode error:", err)
    }

    var cpy map[string]int
    err = dec.Decode(&cpy)
    if err != nil {
        log.Fatal("decode error:", err)
    }

    fmt.Println("cpy:", cpy) // key:3 clef:5
    cpy["key"] = 2
    fmt.Println("cpy:", cpy) // key:2 clef:5
    fmt.Println("ori:", ori) // key:3 clef:5
}

如果您想了解更多关于gobs的信息,可以使用go blog post about it.

答案 1 :(得分:3)

不,没有用于地图深层复制的内置单行内容。

但是,有iterative solutiongeneric package for deep copy

答案 2 :(得分:1)

要添加到Simpfally的答案,encoding/gob的一些问题是结构,只复制导出的字段。并且频道无法编码。

答案 3 :(得分:-1)

复制地图是一些简单的代码行。只需编写代码,尽情享受每个简单代码必须在库中的想法!

original := map[string]int{
    "Hello": 4,
    "World": 123,
}

copy := map[string]int{}
for k, v := range original {
    copy[k] = v
}