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中文網其他相關文章!