中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么拷貝golang的slice

發布時間:2020-06-16 15:20:01 來源:億速云 閱讀:186 作者:元一 欄目:編程語言

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如何拷貝的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诸城市| 内黄县| 隆昌县| 临潭县| 遂宁市| 漯河市| 韩城市| 合川市| 阜平县| 内江市| 桃园市| 崇明县| 新泰市| 磐石市| 永胜县| 河北省| 黔江区| 安丘市| 双峰县| 二连浩特市| 金沙县| 济源市| 汪清县| 大连市| 五河县| 鄄城县| 交城县| 疏附县| 迭部县| 临清市| 嘉鱼县| 涟源市| 广宗县| 纳雍县| 湛江市| 南木林县| 滕州市| 夏邑县| 邵武市| 裕民县| 恩施市|