切片(slice)是對數組的一個連續片段的引用,所以切片是一個引用類型(因此更類似於 C/C++ 中的數組類型,或者 Python 中的 list 類型),這個片段可以是整個數組,也可以是由起始和終止索引標識的一些項的子集,需要注意的是,終止索引標識的項不包括在切片內。
Go語言中切片的內部結構包含地址、大小和容量,切片一般用於快速地操作一塊數據集合,如果將數據集合比作切糕的話,切片就是你要的“那一塊”,切的過程包含從哪里開始(切片的起始位置)及切多大(切片的大小),容量可以理解為裝切片的口袋大小,如下圖所示。
從數組或切片生成新的切片
切片默認指向一段連續內存區域,可以是數組,也可以是切片本身。
從連續內存區域生成切片是常見的操作,格式如下:
slice [開始位置 : 結束位置]
語法說明如下:
- slice:表示目標切片對象;
- 開始位置:對應目標切片對象的索引;
- 結束位置:對應目標切片的結束索引。
從數組或切片生成新的切片擁有如下特性:
- 取出的元素數量為:結束位置 - 開始位置;
- 取出元素不包含結束位置對應的索引,切片最后一個元素使用 slice[len(slice)] 獲取;
- 當缺省開始位置時,表示從連續區域開頭到結束位置;
- 當缺省結束位置時,表示從開始位置到整個連續區域末尾;
- 兩者同時缺省時,與切片本身等效;
- 兩者同時為 0 時,等效於空切片,一般用於切片復位。
程序實例代碼
package main import "fmt" func main() { fmt.Println("從數組或切片生成新的切片") //a 是一個擁有 3 個整型元素的數組,被初始化為數值 1 到 3 var a = [3]int{1, 2, 3} //使用 a[1:2] 可以生成一個新的切片 [2] 就是 a[1:2] 切片操作的結果 fmt.Println(a, a[1:2]) fmt.Println("表示原有的切片") //生成切片的格式中,當開始和結束位置都被忽略時,生成的切片將表示和原切片一致的切片 fmt.Println(a[:]) fmt.Println("重置切片,清空擁有的元素") fmt.Println(a[0:0]) fmt.Println("直接聲明新的切片") //聲明字符串切片 var strList []string //聲明整型切片 var numList []int //聲明空整型切片 var numListEmpty = []int{} //輸出3個切片 fmt.Println(strList, numList, numListEmpty) //輸出3個切片大小 fmt.Println(len(strList), len(numList), len(numListEmpty)) fmt.Println("使用 make() 函數構造切片") c := make([]int, 2) d := make([]int, 2, 10) fmt.Println(c, d) fmt.Println(len(c), len(d)) }
輸出結果