iT邦幫忙

2021 iThome 鐵人賽

DAY 1
0
自我挑戰組

golang 後端菜雞工程師學習雜記系列 第 1

Day1 理解 golang slice 用法及原理 I

  • 分享至 

  • xImage
  •  

我寫什麼

這系列叫做後端菜雞學習雜記,所以我也沒打算特定寫什麼,在熟悉了 go 語法之後,常常只使用其語法,不得其原理,常常寫出來的程式自己無法分析好不好,所以就從探討 go 語言開個起手式,回頭打好基礎。未來可能會談一些後端常用到的技術,比如說 JWT token、 grpc、micro service 等等。


在剛接觸 go 語言時一直覺得 slice 一直很陌生,這次我把 Reference 裏的文章給讀一讀,一探究竟。

其實概念非常簡單。

slice 是一種資料結構,用來描述一段連續的陣列

創建 slice 語法 I

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

創建 slice 語法 II

但其實在 go 語言裡,並不常看到上面兩個例子,更常看到的語法像是這樣,其實效果和第一個例子幾乎一樣

s := []int{0, 1, 2, 3}

在這行程式裡,其實 go 已經建立好一個潛在的陣列 (官方使用 underlying array 這個詞),並且用 slice header 來描述它。我們不需要像上個例子一樣事先宣告陣列再用 slice 描述它,省了一到手續,方便了許多。

下篇將會談到創建 slice 語法 III (使用 make 語法),以及 cap 是什麼。

Reference

文章索引


下一篇
Day2 理解 golang slice 用法及原理 II
系列文
golang 後端菜雞工程師學習雜記18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言