go言語のmap、sliceのコピー

mapのコピー

go言語でmapは参照型のため、コピーするとき注意が必要。
以下にコードを例示する。

package main

import "fmt"

func main() {
	m1 := make(map[string]int)
	m1["a"] = 1
	m1["b"] = 2

	m2 := m1    //同じものを参照する
	m2["c"] = 3

	fmt.Println(m1) //map[a:1 b:2 c:3]
	fmt.Println(m2) //map[a:1 b:2 c:3]
}

完全に別のmapとしてコピーにするには要素を全てコピーする必要がある。

package main

import "fmt"

func main() {
	m1 := make(map[string]int)
	m1["a"] = 1
	m1["b"] = 2

	m2 := make(map[string]int)

	for key, value := range m1 {
		m2[key] = value
	}
	m2["c"] = 3
	fmt.Println(m1) //map[b:2 a:1]
	fmt.Println(m2) //map[c:3 a:1 b:2]
}

sliceのコピー

sliceも同様に参照型であるが、コピーするときはcopyメソッドを使える。

package main

import "fmt"

func main() {
	s1 := []int{1, 2, 3}
	s2 := make([]int, len(s1))
	copy(s2, s1)
	s2 = append(s2, 4)
	fmt.Println(s1) //[1 2 3]
	fmt.Println(s2) //[1 2 3 4]
}

参考

Maps - Go Language