GO語言入門-切片的基礎和本質
1、爲什麼使用切片
- 數組的容量固定,不能自動拓展
值傳遞,數組作爲參數參數時,將整個的數值拷貝一份給形參。
在GO語言當中,我們幾乎可以在所有的場景中,使用切片替換數組。
2、切片的本質
不是一個數組的指針,是一種數據結構體,用來操作數組內部元素。 /runtime/slice.go
- 切片的結構如下:
type slice struct{
*p
len
cap
}
3、切片的使用
切片名稱[low:high:max]
- low: 起始下標位置
- high: 結束下標位置
- 容量:cap = max - low
參考示例:
func main() {
arr := [8] int{1, 2, 3, 4, 5, 6, 7, 8}
s := arr[1:3:5]
fmt.Println("s = ", s)
fmt.Println("len(s) = ", len(s))
fmt.Println("cap(s) = ", cap(s))
s2 := s[0:3]
fmt.Println("s2 = ", s2)
fmt.Println("len(s2) = ", len(s2))
fmt.Println("cap(s2) = ", cap(s2))
}
運行輸出:
s = [2 3]
len(s) = 2
cap(s) = 4
s2 = [2 3 4]
len(s2) = 3
cap(s2) = 4
說明:截取數組 初始化切片時,沒有指定切片容量時,切片容量跟隨原數組(切片)
4、切片的創建
1、自動推導類型創建切片
slice := [] int{1,2,3,4}
2、make方式創建
slice :=make([]int,長度,容量)
3、make創建
slice := make([]int,長度)
當容量爲空時,容量=長度
5、append函數
在切片尾部追加數據
func appends() {
arr := [] int{1, 2, 3, 4, 5, 6, 7, 8}
arr = append(arr, 22)
arr = append(arr, 33)
arr = append(arr, 44)
arr = append(arr, 55)
arr = append(arr, 66)
fmt.Println("arr is ", arr)
}
輸入結果:
arr is [1 2 3 4 5 6 7 8 22 33 44 55 66]
注:向切片增加元素時,切片的容量會自動增長。1024一下時,以兩倍方式增長
6、copy函數
- 函數copy在兩個slice之間複製數據,複製長度以len小的爲準,兩個slice指向同一地層數組,直接對應位置覆蓋。
copy(目標位置切片,原切片)
func copyTest() {
arr := [] int{0, 1, 2, 3, 4, 5, 6, 7, 8}
s1 := arr[7:]
s2 := arr[:2]
copy(s2, s1)
fmt.Println("arr is ", arr)
fmt.Println("s2 is ", s2)
}
輸入結果如下:
arr is [7 8 2 3 4 5 6 7 8]
s2 is [7 8]