基本概念
在 Go 语言中,slice 的深拷贝和浅拷贝主要涉及到 slice 底层数组的复制方式。理解它们的区别对于正确处理数据和避免意外的副作用非常重要。
浅拷贝(Shallow Copy)
浅拷贝是指只复制 slice 的结构(即长度、容量和指向底层数组的指针),而不复制底层数组本身。这意味着两个 slice 共享同一个底层数组。
示例代码
package main
import (
"fmt"
)
func main() {
original := []int{1, 2, 3, 4, 5}
shallowCopy := original
fmt.Println("Original:", original)
fmt.Println("Shallow Copy:", shallowCopy)
// 修改浅拷贝的第一个元素
shallowCopy[0] = 100
fmt.Println("After modification:")
fmt.Println("Original:", original)
fmt.Println("Shallow Copy:", shallowCopy)
}
输出
Original: [1 2 3 4 5]
Shallow Copy: [1 2 3 4 5]
After modification:
Original: [100 2 3 4 5]
Shallow Copy: [100 2 3 4 5]
在这个例子中,shallowCopy 只是 original 的一个浅拷贝。修改 shallowCopy 的元素会影响到 original,因为它们共享同一个底层数组。
深拷贝(Deep Copy)
深拷贝是指不仅复制 slice 的结构,还复制底层数组的内容。这意味着两个 slice 拥有独立的底层数组,修改其中一个 slice 不会影响另一个。
示例代码
package main
import (
"fmt"
)
func main() {
original := []int{1, 2, 3, 4, 5}
deepCopy := make([]int, len(original))
copy(deepCopy, original)
fmt.Println("Original:", original)
fmt.Println("Deep Copy:", deepCopy)
// 修改深拷贝的第一个元素
deepCopy[0] = 100
fmt.Println("After modification:")
fmt.Println("Original:", original)
fmt.Println("Deep Copy:", deepCopy)
}
输出
Original: [1 2 3 4 5]
Deep Copy: [1 2 3 4 5]
After modification:
Original: [1 2 3 4 5]
Deep Copy: [100 2 3 4 5]
在这个例子中,deepCopy 是通过 copy 函数创建的,它复制了 original 的底层数组内容。修改 deepCopy 的元素不会影响到 original,因为它们拥有独立的底层数组。
总结
- 浅拷贝:只复制
slice的结构,不复制底层数组内容,两个slice共享同一个底层数组。 - 深拷贝:不仅复制
slice的结构,还复制底层数组内容,两个slice拥有独立的底层数组。