GoLang - 語言基礎 Slice
在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對 Slice 進行說明
Slice 和 array 一樣可儲存陣列資料,宣告方式也可以跟 array 一樣,差別在於,Slice 不需要宣告長度。
Slice 不需宣告長度,雖然不是動態陣列,在行為上達到動態陣列的功能,在的設計是基於建立一個上層 slice 結構,可操作底下的 array。
宣告 Slice
var sliceName [lengthNum]type
以下方為例子
var sliceName []int{101, 102}
fmt.Printf("array first elem is %d, second elem is %d", sliceName[0], sliceName[1])
使用簡短宣告
sliceName := []type{elem1, elem2...}
例如
sliceName := []int{100, 200}
多維陣列
var sliceName [][]type{{elem..},{elem..}}
定義多維陣列的方式
sliceName := [][]int{{101, 102}, {200, 300, 400}}
fmt.Printf("array first elem is %d, second elem is %d", sliceName[0][0], sliceName[1][0])
操作資料
Slice 便利之處在於,可操作 slice 與 array 資料,
可以透過 index 設定索引位置,以及 length 指定要取得的長度位置,來擷取某片段的 slice 內容
newSLiceName := sliceName[index:length]
這部分,需要特別說明一下,很容易造成誤會:
首先,有以下資料
sliceName := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
我們如果指定要取得 sliceName[2:6],首次使用的人很容易誤認為會取得以下資料
[3,4,5,6,7,8] //誤解
事實上,這裏我們指定從 index 為 2 相對應位置是在 3 。
取得 length 為 6,相對應位置是 6,因此取得的內容會是 [3,4,5,6]。
sliceName := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var sliceData []int
sliceData = sliceName[2:6]
fmt.Println(sliceData)
//output [3 4 5 6]
同樣,也可以透過一樣的方式來取得陣列的資料
例如
arrName := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var sliceData []int
sliceData = arrName[2:6]
fmt.Println(sliceData)
//output [3 4 5 6]
同時,可不指定 index 或 length,預設會從第一個 index 或原始 length
arrName := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var sliceData1, sliceData2, sliceData3 []int
sliceData1 = arrName[:6]
sliceData2 = arrName[2:]
sliceData3 = arrName[:]
fmt.Println(sliceData1, sliceData2, sliceData3)
//output [1 2 3 4 5 6] [3 4 5 6 7 8 9 10] [1 2 3 4 5 6 7 8 9 10]