這系列叫做後端菜雞學習雜記,所以我也沒打算特定寫什麼,在熟悉了 go 語法之後,常常只使用其語法,不得其原理,常常寫出來的程式自己無法分析好不好,所以就從探討 go 語言開個起手式,回頭打好基礎。未來可能會談一些後端常用到的技術,比如說 JWT token、 grpc、micro service 等等。
在剛接觸 go 語言時一直覺得 slice 一直很陌生,這次我把 Reference 裏的文章給讀一讀,一探究竟。
其實概念非常簡單。
slice 是一種資料結構,用來描述一段連續的陣列
arr := [...]int{0, 1, 2, 3} // arr is array
s := arr[:] // s is slice
很常看到第二行這種語法,令人搞混,到底 s 是什麼,看以下圖slice 是一種資料結構,用來描述一段連續的陣列
,此資料結構指的就是圖上的 slice header。
slice header 使用指標儲存某個陣列元素的地址,兩個數字分別儲存 slice 的長度和 cap (cap 之後再提)。這張圖表示,s 這個 slice 描述了 arr 這一整段的陣列。
在概念上 slice header 的結構會像以下
type sliceHeader struct {
ptr *int
len int
cap int
}
當然 slice 也可以描述一小段陣列,以下為描述 [2, 3] 的 slice
arr := [...]int{0, 1, 2, 3} // arr is array
s := arr[2:] // s is slice
但其實在 go 語言裡,並不常看到上面兩個例子,更常看到的語法像是這樣,其實效果和第一個例子幾乎一樣
s := []int{0, 1, 2, 3}
在這行程式裡,其實 go 已經建立好一個潛在的陣列 (官方使用 underlying array 這個詞),並且用 slice header 來描述它。我們不需要像上個例子一樣事先宣告陣列再用 slice 描述它,省了一到手續,方便了許多。
下篇將會談到創建 slice 語法 III (使用 make 語法),以及 cap 是什麼。