GoLang - 語言基礎 Slice

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]