###### 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使用, 所以接下來的操作就不會影響舊陣列。 ![](https://openhome.cc/Gossip/Go/images/Slice-1.JPG) ```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 %}