91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么拷貝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

景德镇市| 辽阳市| 左云县| 高陵县| 铜山县| 庆元县| 舞钢市| 高青县| 霍林郭勒市| 桐梓县| 塔城市| 工布江达县| 长春市| 凯里市| 平江县| 永年县| 滦平县| 湖北省| 沁源县| 德庆县| 赤城县| 宁阳县| 乡城县| 吴忠市| 邢台县| 尚义县| 吉安市| 竹溪县| 获嘉县| 简阳市| 邵阳县| 中牟县| 井冈山市| 亳州市| 辽阳市| 辽宁省| 阿坝| 崇州市| 宿松县| 安塞县| 呼伦贝尔市|