go言語のmap、sliceのコピー

mapのコピー

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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としてコピーにするには要素を全てコピーする必要がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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メソッドを使える。

1
2
3
4
5
6
7
8
9
10
11
12
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