初學 Golang 30 天 - (8)Slice

還記得我們如何建立陣列嗎?不記得的話請回去看昨天的文章!在建立陣列的時候要指定元素的大小,但是!我們今天如果不知道要多大怎麼辦??陣列可以不輸入元素大小嗎?答案是可以!!!不過這個方法會有問題!而且他的型態不是陣列,而是今天要講的 Slice。

Slice

如何建立簡單的 Slice 呢?

 var x []float64

夠簡單了吧!其實就只是指陣列不寫元素大小而已。
Slice 有兩種數值,一個是容量一個是長度。這兩個有什麼不同呢?其實容量就是最大能裝多少,而長度不能超過容量。
那我們要怎麼設定長度跟容量呢?別急~讓我們一步一步來!

x := make([]float64, 5)

這是標準的建立 slice 的方法,這裡設定一個長度和容量都是 5 的 slice 變數 x,這時候你會問說為什麼我只有指定一個 5 ,它卻幫我把長度跟容量設定為 5 呢?這是因為這裡設定的 5 其實是長度,容量則是系統自動配置,會符合最適當大小,所以也是 5 。

x := make([]float64, 5, 10)

如果要自訂容量大小,只要再多一個參數就可以設定囉~很簡單對吧!下面這張圖可以簡單的表示出長度跟容量意思。

enter image description here

我們還可以利用另外一個方法建立 Slice,[low : high]這個方法來參考別的 Slice 或是陣列來建立 Slice。

arr := [5]float64{1,2,3,4,5}
x := arr[0:5]

需要特別注意的點是 high 表示的是結束的點,而不是它的元素位置喔!
以上面的例子來說 arr[0:5] 其實是指 [1,2,3,4,5] ,如果是 arr[1:4] 則是 [2,3,4]。
另外在某些情況下 low 跟 high 是可以省略的,像是 arr[0:5] 這樣子就可以省略成 arr[:5];如果省略成 arr[0:] 則是相當於 arr[0: len(arr)] ;是的,你發現了嗎?你當然可以省略成 [:] ,它相當於 arr[0:len(arr)]。

Append, Copy

Slice 有兩個一定要學會的函式,一個是 Append 另一個是 Copy,讓我們逐一看一下例子:

func main() {
    slice1 := []int{1,2,3}
    slice2 := append(slice1, 4, 5)
    fmt.Println(slice1, slice2)
}

這邊使用 append 把 4 , 5 加入到 Slice1 中,並且賦予 Slice2。如果要更改原本的內容則是要這樣寫:

slice1 = append(slice1, 4, 5)

只要重新覆蓋掉 slice1 就可以了,但是要特別注意!不可以加冒號!冒號是宣告的時候用的短語法。
我這邊設計了一個簡單的小例子,可以看出各種建立的方法,而且 append 跟 [low:high] 方法都不是參照,而是真的建立,如果原始 slice 改變,append 跟 [low:high] 建立的 slice 並不會一起被改變。
http://play.golang.org/p/XFFZGciGuR

slice 內建的另一個好用的方法 copy,可以將一個 slice 的值複製到另外一個 slice,但是無法超過容量限制,下面的範例將容量為 3 的 slice 的數值 1, 2, 3 複製到 slice2 ,但是 slice 2 的容量只有 2,所以實際上 slice2 的值是 1, 2。

func main() {
    slice1 := []int{1,2,3}
    slice2 := make([]int, 2)
    copy(slice2, slice1)
    fmt.Println(slice1, slice2)
}

本文章部份內容修改自 CC3.0 授權的 An Introduction to Programming in Go

comments powered by Disqus