Go语言中Slice(切片)初探

最近上课学习Go语言,看Go语言指南,里面说:一个 slice 会指向一个序列的值,并且包含了长度信息,为了指定容量,可传递第三个参数到 make。感觉有些懵比,指向一个序列的值?指定容量?
我就在Go指南上交互的地方做了点尝试。(本人蒟蒻,如有错误,希望大佬指出的时候不要激动。)

一个Slice(切片)是一个数组片段的描述。它包含了指向数组的指针,片段的长度, 和容量(片段的最大长度)。
我觉得这一点可以通过Slice的基于底层数组创建的方法得到比较直观的体现:

    var a = [3]int {1,2,3}
    h:=a[:]

切片是引用类型,如果你将一个切片赋值给另外一个切片,这两个切片指向的是同一个底层数组。

在Go指南交互界面输入以下代码,可以发现切片指向底层数组,所以指南才会说“一个 slice 会指向一个序列的值”吧。
Go语言中Slice(切片)初探_第1张图片

像下面这样创建一个slice:
b := make([]int, 0, 5)
是不能使用b[0]访问被slice指向的元素的,必须要先
b=append(b,1,2,3)才能够使用下标访问元素。

这张图告诉我们,append不会影响原来的切片的属性,(原来切片的长度和cap)
Go语言中Slice(切片)初探_第2张图片

Go指南里面有这样一段代码,如下图。
Go语言中Slice(切片)初探_第3张图片
开始我不理解,为什么c的len是2,d的cap是3。切片包含了指向数组的指针,而len我们可以理解成能够通过下标访问的元素数量,cap则是切片指向的数组分配的内存能容纳的元素数量。
c := b[:2]
切片c指向的数组起始位置仍然是b[0]的地址,而切片操作是:2,所以c能通过下标访问的元素数量是2。而b指向的数组分配的内存可以容纳5个元素,c的cap和b一样是5。

d := c[2:5]
切片d指向的数组起始位置是c[2]也就是b的第三个元素,因为b分配的内存只能容纳5个元素,d指向的元素已经是第三个了,自然容量(cap)只有3了。

然后我就在想,append是新创建一个数组,还是修改了原来的数组然后返回一个Slice的呢?
下图告诉我们,如果append没有超过原来Slice的cap,那么就在原来Slice指向的位置对应的地址修改,如果超过了cap,就会新建一个更大容量的切片。
Go语言中Slice(切片)初探_第4张图片

你可能感兴趣的:(go语言)