Go語言中切片使用的注意事項小結

2022-09-27 08:51:12 字數 1953 閱讀 2877

前言

go 語言中的slice型別可以理解為是陣列array型別的描述符,包含了三個因素:

程式設計客棧

因此當我們定義乙個切片變數,s := make(int, 5, 10),即為指向了乙個最大長度為10的底層陣列,目前切片s使用到的長度為5。

在使用切片的時候,有幾個注意事項,下面來一起看看吧。

使用append

先看乙個例子:

// 建立乙個整型切片

// 其長度和容量都是 5 個元素

slice := int

// 建立乙個新切片

// 其長度為 2 個元素,容量為 4 個元素

newslice := slice[1:3]

// 使用原有的容量來分配乙個新元素

// 將新元素賦值為 60,會改變底層陣列中的元素

newslice = append(newslice, 60)

fmt.println(slice, newslice)

輸出:[10 20 30 60 50] [20 30 60]

下圖可以非常形象的說明上述**程式設計客棧的執行原理:

僅做一點點小的改變,結果就不一樣了:

// 建立乙個整型切片

// 其長度和容量都是 5 個元素

slice := int

// 建立乙個新切片

// 其長度與容量相同

newslice := slice[1:3:3] // 注意這裡

// 使用原有的容量來分配乙個新元素

// 將新元素賦值為 60,會改變底層陣列中的元素

newslice = append(newslice, 60)

// newslice 的底層陣列已經不是 slice 了,這個改變不會影響 slice

newslice[0] = 0

fmt.println(slice, newslice, cap(newslice))

以上**會輸出:

[10 20 30 40 50] [0 30 60] 4

原因在於:當往 newslice 中新增元素的時候,由於其容量不夠,newslice 會擁有乙個全新的底層陣列,其容量是原來的兩倍(go 會自動完成這個操作,一旦元素個數超過 1000,增長因子會設為 1.25)

使用 range 遍歷 slice

在使用 range 遍歷 slice 的時候,range 會建立每個元素的程式設計客棧副本,看看這個例子:

slice := int

// 迭代每個元素,並顯示值和位址

for index, value := range slice

輸出:value: 10 value-addr: c420014060 elemaddr: c420018080

value: 20 value-addr: c420014060 elemaddr: c420018088

value: 30 value-addr: c420014060 elemaddr: c420018090

value: 40 value-awww.cppcns.comddr: c420014060 elemaddr: c420018098

可以看到 value-addr 跟 elemaddr 的位址是不同的,印證了上面的說法。而每次迭代的變數的位址是相同的,說明迭代過程復用了這個變數,也是一種防止記憶體浪費的做法。

多維切片

建立乙個多維切片:

// 建立乙個整型切片的切片

slice := int, }

其結構可以用下圖來表示:

其中第一維可以看成長度為 2,容量為 2 的儲存了切片型別的切片,第二維則是整形切片。

其他規則則同處理一維切片一樣了,比如:

// 為第乙個切片追加值為 20 的元素

slice[0] = append(slice[0], 20)

上述操作可以用下圖來表示:

總結本文標題: go語言中切片使用的注意事項小結

本文位址:

Go語言中切片slice的宣告與使用

go語言中的切片,是一種動態陣列,它是對陣列的擴充套件。2.1.1 宣告 個未指定 度的陣列來定義切 2.1.2 使 make 函式來建立切 package main import fmt func main 效果如下 圖 1 列印切片的長度 容量和資料元素 s int陣列 arr 5 int可以通...

c語言中goto使用注意事項

在c語言中可以用goto來處理錯誤,但是要特別注意的是goto會順序執行下去,所以在goto中如果沒有分支或retun的話可能會出錯 include 氣泡排序,把陣列中的元素從大到小或從小到大列出 int main void int i,j,temp,count 0 goto out goto ou...

Python語言中的注意事項

python果然是個簡單的東東,套用官方的話說,python是一種簡單易學,功能強大的程式語言,它有高效率的高層資料結構,簡單而有效地實現物件導向程式設計。python簡潔的語法和對動態輸入的支援,再加上解釋性語言的本質,使得它在大多數平台上的許多領域都是乙個理想的指令碼語言,特別適用於快速的應用程...