slice底层数据扩容

66 阅读1分钟

浅拷贝(Shallow Copy)

当使用赋值操作或简单传递切片时,发生的是浅拷贝:

original := []int{1, 2, 3}
copy := original  // 浅拷贝

这种情况下:

  • 原切片original仍然可以访问
  • 两个切片共享底层数组
  • 修改一个切片的元素会影响另一个切片
copy[0] = 99
fmt.Println(original[0]) // 输出 99

深拷贝(Deep Copy)

使用copy()函数或重新切片并追加可以创建深拷贝:

original := []int{1, 2, 3}
newSlice := make([]int, len(original))
copy(newSlice, original)  // 深拷贝

这种情况下:

  • 原切片original仍然可以访问且内容不变
  • 新切片有自己的底层数组
  • 修改一个切片的元素不会影响另一个切片
newSlice[0] = 99
fmt.Println(original[0]) // 输出 1

扩容后的行为

当切片append操作导致扩容时,会创建新的底层数组:

original := []int{1, 2, 3}
newSlice := append(original, 4)  // 可能触发扩容
  • 如果未扩容,两个切片共享部分底层数组
  • 如果扩容了,newSlice会有新的底层数组,original保持不变

总结

  1. 原切片在拷贝后总是可以访问
  2. 浅拷贝时,原切片内容可能随新切片修改而变化
  3. 深拷贝时,原切片内容保持不变
  4. 扩容操作可能导致新切片与原切片分离