Golang 切片

1. 爲何須要切片,和數組區別?

數組是定長的,切片是變長的數組

底層是數組存儲bash

聲明app

var identifier []type

區分數組是[]中沒有數字ide

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

輸出spa

[1 2 3]
[1 2 3]
類型 arr:[3]int, sl:[]int

2. 聲明

2.1 經過 var identifier []typecode

2.2 經過make,如blog

var slice1 []type = make([]type, len,capacity)

其中 capacity 是容量,可省略;len是長度;需capacity >= lenci

3. 定義

3.1 直接初始化it

var sl = []int {1, 2, 3}

3.2 引用數組、切片class

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

相關文章
相關標籤/搜索