[go]关于go语言中的切片,底层数组与切片指针

今天在跟着敲一个项目的时候,那个困扰我多时的问题又浮上心头

很多第三方包中用到反射的时候,会传一个切片指针进去,我就想,切片不本来就是一个指针吗,为啥要传指针的指针 :yinxian:

然后就仔细想了一下

测试代码


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)
}

结果如下:

可以看出,切片实质上是一个指向底层数组内部元素的指针,而切片指针则是指针的指针

画了张图,大致思路如下

那么为什么要这么麻烦呢,直接动“切片”本身这个指针不好吗

我猜想,其实因为切片指向的内容不定,在扩容时指向的底层数组也会随之变化,所以需要用一个值来保存切片这个指针

那么就是底层数组指针的指针,要修改一个东西,必定需要靠它的指针才能进行操作

就像删除链表中某个节点一样,你需要知道它的前一个节点才能进行操作,不然就会丢失信息

本人拙见,待指正

以上

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注