1.slice 概述
- 其本身并不是动态数组或数组指针,它内部通过指针引用底层数组
- 作为变长数组的替代方案,可以关联底层数组的局部或全部
- 是引用类型
- 可以直接创建或从底层数组获取生成
- 使用len()获取元素个数,cap()获取容量
2.创建 slice
//使用:make([]T, len, cap)
//len便是存数的元素个数,cap表示容量
s1 := make([]int, 3, 6) //指定len、cap,底层数组初始化为零值
s2 := make([]int, 3) //省略cap,和len相等
s3 :=[]int{1, 2, 5:3} //按初始化元素分配底层数组,并设置len、cap
var s1 []int //nil切片
s2 := make([]int, 0) //空切片
s3 := []int{} //空切片
不管是nil切片还是空切片,可以对其调用内置函数appen、len、cap
- 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
func main() {
a := []int{0,1,2,3,4,5,6,7,8}
s1 := a[1:4]
s2 := a[3:5]
s1[2] = 10
fmt.Println(a)
fmt.Println(s1)
fmt.Println(s2)
}
3.reslice 概述(slice的切片操作)
- Reslice时索引以被slice的切片为准
- 索引不可以超过被slice的切片的容量cap()值
- 索引越界不会导致底层数组的重新分配而是引发错误
- 新建的切片对象仍然指向原底层数组
s1 := []int{1,2,3,4,5}
s2 := s1[1:] //reslice操作
4.append()与slice
- append可以在slice尾部追加元素
- append可以将一个slice追加到另一个slice尾部
- 如果最终长度未超过追加到slice的容量则返回原始slice
- 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
s1 := []int{0, 1}
s2 := append(s1, 2)
5.copy()与slice
//此处表示a拷贝进b里面,所以b变为1,2,3
func main() {
a := []int{1,2,3,4}
b := []int{5,6,7}
copy(b, a)
fmt.Println(a, b)
}
//把a的第一个元素,拷贝到b的第二个元素上
func main() {
a := []int{1,2,3,4}
b := []int{5,6,7}
copy(b[1:2], a[0:1])
fmt.Println(a, b)
}
网友评论