go append slice问题

148 阅读1分钟

问题:go语言二维切片添加切片的问题

s:= [][]int{}
a := []int{1,2,3}
s = append(s,a)  //s为 [[1,2,3]]
a[0] = 9   //s为[[9,2,3]]

需求: a变化的时候,s保持不变

解决方法一:

temp := make([]int,len(a))
copy(temp,a)
s = append(s,temp)

解决方法二:

s = append(s, append([]int(nil), a...))

原因是: 切片a的值中包含了对底层数组的指针,如果改变a中的值,底层数组不变的话,s也会跟着改变。 但是如果 append(a),有可能导致a扩容,扩容后a的底层数组引用就变了,改变a的值,s不会变化(包含的还是扩容前a的底层数组引用)