3 4 Go語言append 為切片新增元素

2021-10-05 22:08:25 字數 2001 閱讀 1012

var a [

]int

a =(a,1)

// 追加1個元素

a =(a,1,

2,3)

// 追加多個元素, 手寫解包方式

a =(a,

int...

)// 追加乙個切片, 切片需要解包

切片在擴容時,容量的擴充套件規律是按容量的 2 倍數進行擴充,例如 1、2、4、8、16……,**如下:

var numbers [

]int

for i :=

0; i <

10; i++

**輸出如下:

len:1

cap:

1 pointer:

0xc0420080e8

len:

2cap

:2 pointer:

0xc042008150

len:

3cap

:4 pointer:

0xc04200e320

len:

4cap

:4 pointer:

0xc04200e320

len:

5cap

:8 pointer:

0xc04200c200

len:

6cap

:8 pointer:

0xc04200c200

len:

7cap

:8 pointer:

0xc04200c200

len:

8cap

:8 pointer:

0xc04200c200

len:

9cap

:16 pointer:

0xc042074000

len:

10cap

:16 pointer:

0xc042074000

**說明如下:

第 1 行,宣告乙個整型切片。

第 4 行,迴圈向 numbers 切片中新增 10 個數。

第 5 行,列印輸出切片的長度、容量和指標變化,使用函式 len() 檢視切片擁有的元素個數,使用函式 cap() 檢視切片的容量情況。

通過檢視**輸出,可以發現乙個有意思的規律:切片長度 len 並不等於切片的容量 cap。

往乙個切片中不斷新增元素的過程,類似於公司搬家,公司發展初期,資金緊張,人員很少,所以只需要很小的房間即可容納所有的員工,隨著業務的拓展和收入的增加就需要擴充工位,但是辦公地的大小是固定的,無法改變,因此公司只能選擇搬家,每次搬家就需要將所有的人員轉移到新的辦公點。

員工和工位就是切片中的元素。

辦公地就是分配好的記憶體。

搬家就是重新分配記憶體。

無論搬多少次家,公司名稱始終不會變,代表外部使用切片的變數名不會修改。

由於搬家後位址發生變化,因此記憶體「位址」也會有修改。

除了在切片的尾部追加,我們還可以在切片的開頭新增元素:

var a =

inta =([

]int

, a...

)// 在開頭新增1個元素

a =(

int, a...

)// 在開頭新增1個切片

在切片開頭新增元素一般都會導致記憶體的重新分配,而且會導致已有元素全部被複製 1 次,因此,從切片的開頭新增元素的效能要比從尾部追加元素的效能差很多。

var a [

]int

a =(a[

:i],([

]int

, a[i:

]...

)...

)// 在第i個位置插入x

a =(a[

:i],([

]int

, a[i:

]...

)...

)// 在第i個位置插入切片

Go語言切片

go語言切片 go語言切片是對陣列的抽象 go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。宣告乙個未指定大小的陣列來定義切片 var identifier ...

go語言 切片

一 概述 low 陣列下標的起點 high 陣列下標的結束點 不包括此點 arr low arr high len 長度 high low cap 容量 max low 二 切片的長度與容量 package main import fmt func main slice arr 0 3 5 fmt....

Go語言 切片

因為陣列的長度是固定的並且陣列長度屬於型別的一部分,所以陣列有很多的侷限性。例如 func arraysum x 3 int int return sum 這個求和函式只能接受 3 int型別,其他的都不支援。再比如,a 3 int陣列a中已經有三個元素了,我們不能再繼續往陣列a中新增新元素了。切片...