切片
切片类型
切片的英文名称 slice
切片:具有可变长度相同类型元素序列
由于长度是可变的,可以解决数组长度在数据个数不正确情况下浪费内存的情况。
切片和数组声明语法最主要的区别就是长度
1
2var slice []string //切片
var array[3]string //数组
切片只声明为nil,没有开辟内存空间,不能直接操作切片,需要初始化
- 注意:切片只能和nil进行判断是否相等
1
2
3
4
5
6func main() {
var slice []string
fmt.Println(slice)
fmt.Println(slice==nil)
fmt.Printf("%p",slice)
}
定义切片
通过直接指定初始值定初始化一个切片变量
1
2names:= []string{"abc","佳明哥"}
fmt.Println(names)定义完切片后就可以通过
切片对象[脚标]
取出或修改切片中元素内容,语法和数组相同
切片是引用类型
- 引用类型在变量之间赋值时传递的是地址,引用类型变量就是这个类型的指针,切片就是引用类型。
- 值类型在变量之间赋值时传递的是值的副本。
1 | //切片是引用类型 |
make函数
Go语言中可以使用make函数创建 slice 、 map 、 channel 、interface
使用make函数定义无内容,但是不是nil的切片,意味着切片已经申请了内存空间
- make(类型,初始长度 [,初始容量])
- 初始容量可以省略,默认和长度相等。
1
2
3slice := make([]string,0) //长度为0的切片,没有第三个参数表示容量和长度
slice1 := make([]string,0,2) //长度为0 容量为 2
fmt.Println(slice,slice1)长度表示切片中元素实际个数,容量表示切片占用空间大小,且切片成倍增加。当增加到1024后按照一定百分比增加。
- len(slice) 查看切片长度
- cap(slice) 查看切片的容量
1
2
3
4slice :=make([]string,0) //长度为0的切片,没有地第三个参数表示容量和长度相等。
slice1 := make([]string,0,3) //长度为0 ,容量为2
fmt.Println(len(slice),cap(slice))
fmt.Println(len(slice1),cap(slice1))
copy函数
通过copy函数可以把一个切片内容复制到另一个切片中
Go语言标准库源码定义如下
- 第一个参数是目标切片,接收第二个参数内容
- 第二个参数是源切片,把内容拷贝到第一个参数中
1
func copy(dst,src[]type) int
拷贝时严格按照脚标来拷贝
例子:
把短切片拷贝到长切片
1
2
3
4
5s1 := []int {1,2}
s2 := []int {3,4,5,6}
copy(s2,s1)
fmt.Println(s1) //输出:{1 2}
fmt.Println(s2) //输出:{1 2 5 6}把长切片拷贝到短切片中
1
2
3
4
5s1 := []int {1,2}
s2 := []int {3,4,5,6}
copy(s1,s2)
fmt.Println(s1) //输出:{3 4}
fmt.Println(s2) //输出:{3 4 5 6}把切片片段拷贝到切片中
1
2
3
4
5s1 := []int {1,2}
s2 := []int {3,4,5,6}
copy(s1,s2[1:])
fmt.Println(s1) //输出:{3 4}
fmt.Println(s2) //输出:{3 4 5 6}