首頁 > 後端開發 > Golang > 為什麼修改 Go 切片副本也會更改原始切片?

為什麼修改 Go 切片副本也會更改原始切片?

Barbara Streisand
發布: 2024-11-19 06:44:02
原創
267 人瀏覽過

Why Does Modifying a Go Slice Copy Also Change the Original?

了解 Go 中的切片修改

在 Go 中,切片變數的行為與典型陣列不同。這可能會導致意外的行為,尤其是在修改切片時。

更改原始切片的奧秘

考慮以下程式碼:

import "fmt"

func main() {
    A := []int{3, 4, 5, 3, 7}

    fmt.Println("Initial slice: ", A)
    funcSome(A)
    fmt.Println("Modified slice: ", A)
}

func funcSome(slice []int) {
    fmt.Println("Inside function, original slice: ", slice)
    temp := slice // copy by value

    temp[0] = 10
    fmt.Println("Inside function, modified temp: ", temp)
    fmt.Println("Inside function, original slice: ", slice)
}
登入後複製

當您執行此程式碼時,您可能會驚訝地發現修改臨時切片temp 也會修改原始切片A。

深入研究切片內部

為了理解這種行為,我們需要深入研究切片的內部結構。切片變數由三個部分組成:

  • 指標:指向保存資料的支援陣列
  • 長度:切片中的元素數量
  • 容量:切片的最大容量

當您按值將切片分配給新變數時,就像我們對temp := slice 所做的那樣,您正在建立一個淺拷貝。這意味著新切片 (temp) 與原始切片 (slice) 共享相同的支援陣列和指標。

append() 困境

append( Go 中的) 函數透過建立新的支援陣列並將現有資料複製到其中來將元素加入切片中。但是,如果新切片的容量不足,append() 函數將透過重新分配更大的後備數組來自動增加容量。

在您的範例中,remove() 函數使用append() 建立一個新的切片片。由於 temp 和 A 共享相同的後備數組,因此對新切片的任何修改也會影響原始切片。

結論

理解 Go 中的切片修改需要熟悉其獨特的內部結構。請記住,按值複製切片時,您正在建立一個淺拷貝,它共用相同的後備數組。修改切片時,此行為可能會導致意外後果。

以上是為什麼修改 Go 切片副本也會更改原始切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板