浅拷贝(Shallow Copy)
浅拷贝是指只复制切片本身的结构(指针、长度和容量),而不复制底层数组的元素。
实现方式
-
直接赋值:
goslice1 := []int{1, 2, 3} slice2 := slice1 // 浅拷贝
-
切片操作:
goslice1 := []int{1, 2, 3} slice2 := slice1[:] // 浅拷贝
特点
- 新切片和原切片共享同一个底层数组
- 修改一个切片的元素会影响另一个切片
- 内存效率高,因为不需要复制底层数据
示例
go
package main
import "fmt"
func main() {
original := []int{1, 2, 3}
copy := original // 浅拷贝
copy[0] = 100
fmt.Println(original) // [100 2 3]
fmt.Println(copy) // [100 2 3]
}
深拷贝(Deep Copy)
深拷贝是指创建一个新的切片,并且复制底层数组的所有元素。
实现方式
-
使用copy函数:
goslice1 := []int{1, 2, 3} slice2 := make([]int, len(slice1)) copy(slice2, slice1) // 深拷贝
-
使用append(需要先创建一个空切片):
goslice1 := []int{1, 2, 3} slice2 := append([]int{}, slice1...) // 深拷贝
特点
- 新切片有自己的底层数组
- 修改一个切片的元素不会影响另一个切片
- 内存消耗更大,因为需要复制所有数据
示例
go
package main
import "fmt"
func main() {
original := []int{1, 2, 3}
copy := make([]int, len(original))
copy(copy, original) // 深拷贝
copy[0] = 100
fmt.Println(original) // [1 2 3]
fmt.Println(copy) // [100 2 3]
}
注意事项
-
copy函数的行为:
- 如果目标切片长度小于源切片,只会复制目标切片长度的元素
- 如果目标切片长度大于源切片,多余的元素保持不变
-
多维切片的拷贝:
- 对于多维切片,
copy
函数或append
只能实现第一层的深拷贝 - 内层切片仍然是浅拷贝,需要递归处理才能实现完全深拷贝
- 对于多维切片,
-
性能考虑:
- 浅拷贝更快且内存效率更高
- 深拷贝更安全但消耗更多资源
总结
特性 | 浅拷贝 | 深拷贝 |
---|---|---|
实现方式 | 直接赋值或切片操作 | copy函数或append |
底层数组 | 共享 | 独立 |
修改影响 | 互相影响 | 互不影响 |
内存消耗 | 低 | 高 |
适用场景 | 不需要独立修改或关注性能的场景 | 需要独立修改或确保数据安全的场景 |