1. 為什么需要切片,和數組區別?
數組是定長的,切片是變長的
底層是數組存儲
聲明
var identifier []type
區分數組是[]中沒有數字
var arr = [3]int {1, 2, 3} fmt.Println(arr) var sl = []int {1, 2, 3} fmt.Println(sl) fmt.Printf("類型 arr:%T, sl:%T", arr, sl
輸出
[1 2 3] [1 2 3] 類型 arr:[3]int, sl:[]int
2. 聲明
2.1 通過 var identifier []type
2.2 通過make,如
var slice1 []type = make([]type, len,capacity)
其中 capacity 是容量,可省略;len是長度;需capacity >= len
3. 定義
3.1 直接初始化
var sl = []int {1, 2, 3}
3.2 引用數組、切片
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
var num3 = s[6:7]
4. 添加元素、擴容
4.1 通過下標直接復制
4.2 通過append追加
var nums2 = make([]int, 3, 4) fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2) nums2 = append(nums2, 1, 2,3) fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)
輸出
len:3 cap:4 slice:[0 0 0]len:6 cap:8 slice:[0 0 0 1 2 3]
說明:make([]int, 3, 4) 已經給前三個元素復制0了,append的時候在后面追加;當切片長度大於容量時會自動擴容,容量變為原來的二倍
另外,不僅可以擴容單個元素,還可以擴容數組、切片
var num_tmp = []int{5,5,5} nums2 = append(nums2, num_tmp...)
此時注意num_tmp后面需要加...表示添加里面的元素
5. 長度len, 容量cap
var nums2 = make([]int, 3, 4) nums2[0] = 0 nums2[1] = 1 nums2[2] = 2 fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)
輸出
len:3 cap:4 slice:[0 1 2]
注:此時訪問nums2[3]是不行的,因為並未初始化
panic: runtime error: index out of range [3] with length 3
6. copy
num4 := make([]int, len(nums2), 2 * len(nums2)) copy(num4, nums2) nums2[0] = 1000 fmt.Println(num4, nums2) fmt.Printf("%p, %p", num4, nums2)
拷貝后兩個切片指向不同的數組(地址不同),nums2改了其中的一個元素,對num4沒影響(深拷貝)
輸出
[0 0 0 1 2 3 5 5 5] [1000 0 0 1 2 3 5 5 5]
0xc000098090, 0xc000096000
