go slice 理解
go slice 理解
切片的定义
切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。
切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。
切片的所在
// 由于a 指向m a是 {1} 然后 append(a, 4)修改了底层数组,在底层数组[1]处追加了 相当于m[1] = 4
m := [4]int{1, 2, 3}
a := m[:1]
a = append(a, 4) // 修改底层
fmt.Println(a) // 1 , 4
fmt.Println(m) // 1 , 4 , 3 , 0
m := [4]int{1, 2, 3, 4}
s1 := m[:2]
s2 := m[:4] // slice 的容量为底层数组,开始切的位置 到 底层数组的最后
fmt.Printf("s1扩容前地址: %p \n", s1)
s1 = append(s1, 5, 6, 7) // 因为append添加时如果容量超出则返回的是新切片,对这个新切片操作不会影响原来的
fmt.Printf("s1扩容后地址: %p \n", s1)
s1 = append(s1, 8)
fmt.Println(s1) // [1 2 5 6 7 8]
fmt.Println(s2) // [1 2 3 4]
// s1扩容前地址: 0xc0000103a0
// s1扩容后地址: 0xc00000e380