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]