Golang append原理以及發生了什麼

2021-10-21 02:11:13 字數 1254 閱讀 6282

type slice struce
func

(slice [

]type,elems ...type)

[值為結構體的情況下考慮使用指標。返回乙個新的切片

先根據傳參觀察是否需要擴容

如果要擴容,擴容本質是分配一塊更大的記憶體,並將舊slice的資料拷貝進新的slice。若原slice容量小於1024就會將容量擴大為原來的兩倍,否則擴大為原來的1.25倍,這樣可以節約資源(似乎go還會根據元素型別做一些微調,這裡先不管)。擴容完成後將要追加的資料分配進去,且新的slice指向新的陣列。例:

arr1:=[4

]int

//1,2,3,4

sli1:=arr1[0:

3]//1,2,3

case1:需要擴容

sli2:=

(sli1,8,

9)//1,2,3,8,9

fmt.

println

(arr1)

//1,2,3,4

case2:不需要擴容

sli2:=

(sli1,8)

//1,2,3,8

fmt.

println

(arr1)

//1,2,3,8

x:=

make([

]int,0

,10)

x=(x,1,

2,3) 此時的底層陣列:1,2

,3,0

,0,0

,0,0

,0,0

y:=(x,8

) 此時的底層陣列:1,2

,3,8

,0,0

,0,0

,0,0

z:=(x,10

) 此時的底層陣列:1,2

,3,10

,0,0

,0,0

,0,0

fmt.

println

(x) 仍為1,2

, fmt.

println

(y)1,2

,3, fmt.

println

(z)1,2

,3,10 此時的底層陣列:1,2

,3,10

,0,0

,0,0

,0,0

多執行緒 ReentrantLock的原理以及使用

兩個執行緒之間通訊根據不同的條件進行不同的通訊 1.await 其他程阻塞,要是當前執行緒向下執行,那麼其他的執行緒必須喚醒它本身,這樣當前執行緒才可以繼續向下執行 2.signal 喚醒當前執行緒 public class main public static void main string a...

訊息佇列實現原理(以kafka為例)

訊息佇列中介軟體是分布式系統中重要的元件,主要解決應用耦合,非同步訊息,流量削鋒等問題。實現高效能 高可用 可伸縮和最終一致性架構。使用較多的訊息佇列有kafka activemq rabbitmq zeromq metamq rocketmq。訊息佇列在實際應用中常用的使用場景 非同步處理,應用解...

屬性指令的解析原理 以 v if 為例

面試中,面試官不免要問,關於v if這類的指令,實現的原理是什麼?效果圖示 htnl id root 我是指令的展示和隱藏div 我是要隱藏的div div 我們期望在介面上,展示的效果是這樣的 第一步 獲取元素dom節點 var el document.getelementbyid root 第二...