8、go的切片
切片的理解
func main() {
// 切片是构建在数组之上
// 定义数组
var intarr [6]int = [6]int{1, 4, 7, 3, 6, 9}
// 定义切片,从下标1位置截取到下标2的位置,不包含下标3的位置
slice := intarr[1:3]
fmt.Println("intarr:", intarr) // intarr: [1 4 7 3 6 9]
fmt.Println(slice) // [4 7]
// 切片的容量是动态变化的
fmt.Println("slice的容量:", cap(slice)) // slice的容量: 5
}
定义切片
func main() {
// 定义切片: make()函数的三个参数:1、切片类型, 2、切片长度, 3、切片容量
slice := make([]int, 4, 20)
fmt.Println(slice) // [0 0 0 0]
fmt.Println("切片的长度:", len(slice)) // 切片的长度: 4
fmt.Println("切片的容量:", cap(slice)) // 切片的容量: 20
}
切片的遍历
和数组一样的
func main() {
slice := make([]int, 4, 20)
slice[0] = 66
slice[1] = 88
slice[2] = 99
slice[3] = 100
// 方式1: 普通for循环
for i := 0; i < len(slice); i++ {
fmt.Printf("slice[%v] = %v \t", i, slice[i])
// 打印:slice[0] = 66 slice[1] = 88 slice[2] = 99 slice[3] = 100
}
fmt.Println()
// 方式2: for-range循环
for i, v := range slice {
fmt.Printf("下标: %v, 元素: %v \n", i, v)
}
// 打印:
//下标: 0, 元素: 66
//下标: 1, 元素: 88
//下标: 2, 元素: 99
//下标: 3, 元素: 100
}
切片的注意点
func main() {
var intarr [6]int = [6]int{1, 4, 7, 3, 6, 9}
// 定义切片
var slice []int = intarr[1:4]
fmt.Println(len(slice)) // 3
fmt.Println(slice) // [4 7 3]
slice = append(slice, 88, 50)
fmt.Println(slice) // [4 7 3 88 50]
// 另一种追加方式
slice3 := []int{99, 44}
slice = append(slice, slice3...)
fmt.Println(slice) // [4 7 3 88 50 99 44]
var a []int = []int{1, 4, 7, 3, 6, 9}
var b []int = make([]int, 10)
copy(b, a) // 把a中对应的数组的元素复制到b中
fmt.Println(b) // [1 4 7 3 6 9 0 0 0 0]
}
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙