前言
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簡潔的語法和對動態輸入的支援,再加上解釋性語言的本質,使得它在大多數平台上的許多領域都是乙個理想的指令碼語言,特別適用於快速的應用程...