Go Slice/Map 复制陷阱
在Go语言中,对于Slice和Map类型的数据,直接使用=操作符进行复制时,实际上是进行的浅复制。这意味着新的变量和原始变量指向的是同一个底层数据结构。因此,任何对这些数据结构的修改都会影响到两个变量。
为了避免这个问题,我们需要对Slice和Map类型的数据进行深复制。
解决方案1:使用copy
函数复制Slice
originalSlice := []int{1, 2, 3}
copiedSlice := make([]int, len(originalSlice))
copy(copiedSlice, originalSlice)
解决方案2:使用range
遍历构造新的Slice
originalSlice := []int{1, 2, 3}
copiedSlice := make([]int, len(originalSlice))
for i, v := range originalSlice {
copiedSlice[i] = v
}
解决方案3:使用append
函数复制Slice
originalSlice := []int{1, 2, 3}
copiedSlice := append([]int(nil), originalSlice...)
解决方案4:使用copy
函数复制Map
originalMap := map[string]int{"one": 1, "two": 2}
copiedMap := make(map[string]int)
for k, v := range originalMap {
copiedMap[k] = v
}
解决方案5:使用json.Marshal
和json.Unmarshal
进行深度复制
import (
"encoding/json"
)
originalMap := map[string]int{"one": 1, "two": 2}
copiedMap := make(map[string]int)
data, _ := json.Marshal(originalMap)
json.Unmarshal(data, &copiedMap)
注意:使用json.Marshal
和json.Unmarshal
进行深度复制时,需要注意的是,如果Map中包含有函数、循环引用或者无法序列化的值时,会导致错误。此外,这种方法也无法复制无法序列化的字段。
评论已关闭