基本概念
在 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
擁有獨立的底層陣列。