slice切片切割成数组,数组指针指向原slice的位置
切片理解
切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。
举个例子,现在有一个数组
a := [8]int{0, 1, 2, 3, 4, 5, 6, 7}
,切片s1 := a[:5]
,相应示意图如下。
切片s2 := a[3:6]
,相应示意图如下:
代码验证数组的指针:
package main import "fmt" func main() { sl := make([]int, 6) fmt.Printf("%p\n", &sl) //地址用%p //slice 切割成数组,数组的指针地址指向切割的第一个元素 a := [5]int{1, 2, 3, 4, 5} fmt.Printf("p:%p\n", &a[1]) //p:0x1400011a068 s := a[1:5] //p:0x1400011a068 fmt.Printf("s:%v,p:%p,len(s):%v,cap(s):%v\n", s, s, len(s), cap(s)) //多次切割还是指向原来slice的切割位置的元素地址 fmt.Printf("p:%p\n", &a[4]) //p:0x1400011a080 s2 := s[3:4] //p:0x1400011a080 fmt.Printf("p:%p\n", s2) //切割的数组是slice的引用,修改数组会修改原slice数据 s2[0] = 66 fmt.Println(a, s, s2) //[1 2 3 4 66] [2 3 4 66] [66] }