数组
定义数组
var array1 [5]int
array2 := [3]int {1, 2, 3}
array3 := [...]int {1, 2, 3}
循环数组
for key, value := range arrays {
......
}
for _, value := range arrays {
......
}
数组作为参数是值传递,go语言数组可以通过切片来代替数组指针多数需求
切片
定义切片
array := [...]int{1, 2, 3, 4, 5}
slice1 := array[2:4]
slice2 := array[2:]
slice3 := array[:2]
slice4 := array [:]
- slice本身没有值,slice是对array底层的一个view。
array := [...]int{1, 2, 3, 4, 5}
slice1 := array[2:4]
slice1[0] = 10
fmt.Println(array) // 1, 2, 10, 4, 5
- slice可以对slice本身再次slice
array := [...]int{1, 2, 3, 4, 5}
slice1 := array[2:4]
fmt.Println(slice1) // 3, 4
slice1 = slice1[1:]
fmt.Println(slice1) // 4
切片的扩展
array := [...]int{0, 1, 2, 3, 4, 5}
slice1 := array[1:3]
fmt.Println(slice1) // 1, 2,
slice2 := slice1[1:4]
fmt.Println(slice2) // 2, 3, 4
fmt.Println(slice1[4]) // 报错
slice组成
- ptr slice在数组上的开始位置指针
- len slice的长度
- cap slice对应的array从ptr开始到结束的整个长度
所以 slice2 := slice1[1:4]
正确,fmt.Println(slice1[4])
报错。
切片的扩展总结
- slice可以reslice
- slice可以向后扩展,不可以向前扩展
- s[n],n不能超过len(s)。向后扩展不能超过cap(s)
切片的操作
arr := [...]int{0, 1, 2, 3, 4, 5}
s1 := arr[3:5]
s2 := append(s1, 10)
s3 := append(s2, 11)
fmt.Println("s1 s2 s3 = ", s1, s2, s3) // [3, 4] [3, 4, 10], [3, 4, 10, 11]
fmt.Println("arr = ", arr) // [0, 1, 2, 3, 4, 10]
// create
s4 := make([]int, 16, 32) // slice16 底层数组32
// copy
copy(s4, s1) // s4 [3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
fmt.Println(s4, len(s4), cap(s4)) // [3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 16 32
// delete
s4 = append(s4[:1], s4[2:]...)
fmt.Println(s4, len(s4), cap(s4)) // [3 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 15 32
切片操作总结
- 添加元素超过cap,系统会重新分配更大的底层数组
- 添加元素为超过cap,会覆盖底层数组append位置上的值
- 由于值传递的关系,必须接受append返回值