您好,登錄后才能下訂單哦!
slice理解
golang 的slice是一個指向底層的數組的指針結構體。
slice 方法返回一個包含 stringObj 的指定部分的 String 對象。
slice 方法一直復制到 end 所指定的元素,但是不包括該元素。如果 start 為負,將它作為 length + start處理,此處 length 為數組的長度。如果 end 為負,就將它作為 length + end 處理,此處 length 為數組的長度。如果省略 end ,那么 slice 方法將一直復制到 arrayObj 的結尾。如果 end 出現在 start 之前,不復制任何元素到新數組中。
這個結構體有三個屬性,1.指向數組指針,2.len: slice中元素的數量 3.cap:slice占用內存數量。
只有深刻理解這三個屬性才能在使用slice中不至于犯錯。
正確理解變量和共享
多個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如何拷貝的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。