切換語言為:簡體

Go語言中slice的深複製和淺複製

  • 爱糖宝
  • 2024-10-24
  • 2067
  • 0
  • 0

基本概念

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

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.