基本概念
在 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
拥有独立的底层数组。