續上篇 Day1 理解 golang slice 用法及原理 I
什麼是 slice 是的容量 (capbility,也就是上篇所提的 cap),跟長度有什麼關係 (length)?
打個比方,有一瓶礦泉水,礦泉水最多能容納 600cc,但是實際上只裝有 300cc 的水。大概就是這種感覺。
s := make([]int, 3, 5)
make 創建了個型態為 int 長度為 5 的 underlying array,並且用一個名為 s 的 slice 描述了從第零個元素到第三個元素的片段。
最後一個創建方式
s := make([]int, 3)
其實就創建一個長度為 3 的 underlying array,並且使用 s 描述這一整段 array,有就是說 len(s) 等於 cap(s)。
眾所皆知 array 是不能伸縮的,underlying array 也是 array,所以 array 不能伸縮。但是 slice 可以透過 slice header 的長度的更改就輕易達到了伸縮
的效果。
slice 最常看見的語法就是用分號取一小個片段,所以 slice 能縮小是確定的。
但是 slice 能伸長嗎?答案是可以的。
s := make([]int, 3, 5)
s = s[:len(s) + 1]
沒錯,你沒看錯,這段程式是不會 panic 的。還記得礦泉水的例子嗎,水沒裝滿當然能繼續裝啊,只要不裝超過容量就行。同理,這段程式,s 只要伸張不超過容量就不會 panic。
但是這段程式是為了觀念所寫,除非有什麼特定場景,不然沒事千萬別這樣幹。如果覺得 slice 長度不夠,大多數情況下用 append 函式解決,後面幾張也會提到 append 是怎麼做的。