###### tags: `Golang`
# 切片 Slice
可將slice想成對陣列的操作界面,意為以陣列為基層的界面操作,
對slice的變動會直接影響底層的陣列。
## 基本slice
透過slice可以簡單的切割陣列,取出想要的資料區間。
格式:arr[M,N]
取得區間為M ~ N-1
若留空的話,M預設陣列的起始位置「0」,N預設陣列長度,此例中為「5」
```go=
arr := []int{1,2,3,4,5}
slice := arr[1:4]
fmt.Printf(slice) //印出切片陣列
// [2 3 4]
slice1 := arr[1:] //等同[1:5]
fmt.Printf(slice1)
// [2 3 4 5]
slice2 := arr[:4] //等同[0:4]
fmt.Printf(slice2)
// [1 2 3 4]
```
## 變更資料
對slice的操作會直接影響底層的陣列
```go=
arr := []int{1,2,3,4,5}
slice := arr[1:4]
slice[0] = 10
slice[1] = 20
slice[2] = 30
fmt.Println(arr) //印出底層陣列
// [1 10 20 30 5]
```
## 長度(lenhth) & 容量(capacity)
長度代表該切片目前的陣列長度,
容量則是該切片所能儲存的數量,
若是長度超過容量值,
會自動將容量\*2,
讓長度可以繼續增加,
但當容量自動增加時,
Go是產生新的基層陣列(擴大後)並繼承舊陣列資料供slice使用,
所以接下來的操作就不會影響舊陣列。

```go=
oldArr := []int{1, 2, 3, 4, 5}
slice := oldArr[1:5] // cap -> 5
slice = append(slice, 6) // 因超過5,Go產生新的基層陣列,cap為10
slice[0] = 100
fmt.Println(oldArr)
fmt.Println(slice)
// [1 2 3 4 5] oldArr
// [100 3 4 5 6] slice
```
## slice宣告
同動態產生一個變數空間,此為動態產生一個slice空間,可指定長度與容量。
```go=
slice := make([]string, 2, 5)
fmt.Printf("len = %d , cap = %d , 位址= %p \n", len(slice), cap(slice), slice)
// len = 2 , cap = 5 , 位址= 0xc0000be000
slice1 := make([]int, 2)
fmt.Printf("len = %d , cap = %d , 位址= %p \n", len(slice1), cap(slice1), slice1)
// len = 2 , cap = 2 , 位址= 0xc0000b6030
```
# Dark Theme
{%hackmd theme-dark %}