今天在跟着敲一个项目的时候,那个困扰我多时的问题又浮上心头
很多第三方包中用到反射的时候,会传一个切片指针进去,我就想,切片不本来就是一个指针吗,为啥要传指针的指针
然后就仔细想了一下
测试代码
func main() {
nums := [...]int{1, 2, 3, 4, 5, 6, 7}
numsSlice := nums[1:]
fmt.Printf("%p\n", &nums)
fmt.Printf("%p\n", numsSlice)
fmt.Printf("%p\n", &numsSlice)
}
结果如下:
可以看出,切片实质上是一个指向底层数组内部元素的指针,而切片指针则是指针的指针
画了张图,大致思路如下
那么为什么要这么麻烦呢,直接动“切片”本身这个指针不好吗
我猜想,其实因为切片指向的内容不定,在扩容时指向的底层数组也会随之变化,所以需要用一个值来保存切片这个指针
那么就是底层数组指针的指针,要修改一个东西,必定需要靠它的指针才能进行操作
就像删除链表中某个节点一样,你需要知道它的前一个节点才能进行操作,不然就会丢失信息
本人拙见,待指正
以上