Go 程式設計教學:陣列 (Array) 和切片 (Slice)

PUBLISHED ON SEP 21, 2017 — PROGRAMMING

在我們先前的程式中,變數代表單一的實體 (entity),然而,我們有時候想要操作多個資料,在電腦程式中,使用各種容器 (collection) 來操作資料;透過容器,我們可以更有效率地操作資料。在本文中,我們介紹陣列 (array) 和切片 (slice),這兩種容器皆是線性的 (linear)。

陣列

陣列是一種線性的容器,可以把陣列想到一排藥盒,每個格子中儲存一個資料。陣列的限制在於只能儲存同一種類型的資料,而且建立後長度不能改變。以下實例中建立一個四個元素的字串陣列,然後以陣列索引 (index) 對陣列賦值:

要注意的是,陣列索引是從 0 開始,而非從 1 開始;在本例中,變數 lang 是一個陣列,長度為 4。或者,可用較短的語法同時宣告陣列及賦值:

先前我們提過,Go 的 for 迴圈可以使用迭代器 (iterator),迭代器是一種走訪容器的方法,透過迭代器,程式設計者不需要知道容器內部的結構,就可以走訪容器內部的元素。

如果不需要索引,可以使用啞變數代替:

要注意的是,使用迭代器時,對陣列元素的修改是沒有效果的,如以下實例:

若要修改陣列中的元素,要以索引走訪陣列,再直接修改陣列的元素的值:

切片

由於陣列長度在建立後就不能更動,Go 提供切片 (slice) 這種容器。切片和陣列相似,同樣也是線性的、以數字為索引,索引值同樣從 0 開始。如下例:

建立切片時,不需預設其長度,因切片會動態改變其長度。

切片也可以由已有的陣列來建立,如下例:

切片的內部,其實也是陣列,切片本身不儲存值,而是儲存到陣列的參考 (reference),簡單地說,切片和陣列內部儲存同一份資料,但透過兩個不同的變數來處理;在我們的這個例子中,我們修改切片的值,原本陣列的值也一併修改了。

我們也可以利用多維切片製作矩陣 (matrix),見下例:

切片也可以動態產生,使用 make 做為關鍵字。如下例,我們動態產生一個長度為 5 的切片:

我們在前文中提過,切片長度可以動態改變。在以下例子中,切片的長度由 5 變成 8:

如果要從切片中移除元素,則需一點小技巧。在本例中,我們移除第三個元素:

小結

在本文中,我們介紹了陣列和切片兩種容器,兩者皆為線性的容器,以數字做為索引,索引值從 0 開始。由於切片可動態改變大小,此外,Go 對切片提供額外的函式,在實務上,切片反而用得比陣列多。

comments powered by Disqus