Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a built in function in go for making copies of arbitrary maps?

Tags:

go

Is there a built in function in go for making copies of arbitrary maps?

I would be able to write one by hand but I found out earlier I was looking a similar question when I wanted to make a deep comparison of maps and there seemed to be a function already built in for that! So similarly, maybe I was wondering if there was an built in or some library or package for making deep copies of maps in golang. I am sure I am not the first person to want to make copies of maps in go.

By copy I mean you can create two different variables that reference a different map in memory even though they are the same content wise.

like image 355
Charlie Parker Avatar asked Apr 12 '14 16:04

Charlie Parker


2 Answers

For a more general answer, you can encode your map and decode it in a new variable with encoding/gob.

The advantages of this way is that it'll even work on more complex data structure, like a slice of struct containing a slice of maps.

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
}

If you want to know more about gobs, there is a go blog post about it.

like image 156
Simpfally Avatar answered Nov 07 '22 07:11

Simpfally


No, there is no built-in one-liner for map deep copy.

However, there is an iterative solution as well as a generic package for deep copy.

like image 21
bishop Avatar answered Nov 07 '22 09:11

bishop