什麼是動態數組
動態數組就是不指定長度,使其長度自動變化。
動態數組參數
- 動態數組幾個很重要的參數
數組指針、長度、容量
數組指針: 指向數組–>> 數組
// runtime
type slice struct {
array unsafe.Pointer // 指針
len int // 長度
cap int // 容量
}
動態數組的使用
- 第一種:
// 定義數組
arr := []int{1,2,3}
fmt.Println(arr, len(arr), cap(arr))
打印: [1 2 3] 3 3
- 第二種
func main() {
s1 := make([]int, 3) // 創建數組
fmt.Println(s1, len(s1), cap(s1)) // 創建容量
s2 := make([]int, 3, 6)
fmt.Println(s2, len(s2), cap(s2))
}
result:
[0 0 0] 3 3
[0 0 0] 3 6
- 第三種
func main() {
var s1 []int
emptySlice := []int{}
fmt.Printf("len = %d, cap = %d, %#v\n", len(s1), cap(s1), s1)
fmt.Printf("len = %d, cap = %d, %#v\n", len(emptySlice), cap(emptySlice), emptySlice)
}
result:
len = 0, cap = 0, []int(nil)
len = 0, cap = 0, []int{}
// 觀察得到: 沒有定義初始化空間,地址指向nil
談談關於Cap、length的理解
- 第一種
定義一個數組、基於數組做切片
func main() {
data :=[...]int{0,1,2,3,4,5}
slice :=data[1:4:5]
// length = length -start = 4 -1 = 3
// cap = max - start = 5 -1 = 4
fmt.Printf("len = %d, cap = %d, %#v\n", len(slice), cap(slice), slice)
// length = length -start = 1 - 0 =1
// cap = max - start = max(6)- 0 = 6
slice1 :=data[:1]
fmt.Printf("len = %d, cap = %d, %#v\n", len(slice1), cap(slice1), slice1)
// length = length -start = 1- 0 =1
// cap = max - start = max(3)- 0 =3
slice2 :=data[:1:3]
fmt.Printf("len = %d, cap = %d, %#v\n", len(slice2), cap(slice2), slice2)
// length = length -start = 6 -0 =6
// cap = max - start = 6 -0 =6
slice3 :=data[:]
fmt.Printf("len = %d, cap = %d, %#v\n", len(slice3), cap(slice3), slice3)
}
result:
len = 3, cap = 4, []int{1, 2, 3}
len = 1, cap = 6, []int{0}
len = 1, cap = 3, []int{0}
len = 6, cap = 6, []int{0, 1, 2, 3, 4, 5}