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]
}