首頁  >  文章  >  後端開發  >  golang slice如何拷貝

golang slice如何拷貝

(*-*)浩
(*-*)浩原創
2019-12-17 11:24:173457瀏覽

golang slice如何拷貝

golang 的slice是指向底層的陣列的指標結構體。 

這個結構體有三個屬性,1.指向陣列指針,2.len: slice中元素的數量 3.cap:slice佔用記憶體數。 

只有深刻理解這三個屬性才能在使用slice中不至於犯錯。 (推薦學習:go

正確理解變數和共享

多個slice之間可以共享底層的數據,並且引用的數組部分區間可能重疊

以上是golang 聖經中的一句話。深刻理解這句話對於日程編程非常有意義。

什麼時候共享資料會被其他變數修改

func f1()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]
    a1[1] = 999
    
    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

#運行結果

a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3]
Process finished with exit code 0

我們清楚的看到了資料共享,此時修改了a1 ,兩位兩個變數都被修改

什麼時候不會修改

func f2()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]
    a2 = append(a2,888)
    a1[1] = 999
    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

執行結果

#
a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3]
Process finished with exit code 0

可以雖然a1被修改,a2並沒有修改。我們知道append函數會面臨記憶體的重新分配。所以等a2進行append的時候,會重新申請記憶體空間,將原有陣列拷貝然後增加如新值。也就是當append操作的時候,此時a2 不在和a1 共享記憶體了。

在複製slice的時候,如果面臨多個變數同時指向一個陣列的時候,一定要考慮到資料的共享和記憶體的重新分配。 ######

以上是golang slice如何拷貝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多