接下来说,思考如下题,定义一个切片array,然后对该切片array进行截取操作(范围自定义),得到新的切片s6, 并修改切片s6某个元素的值。代码如下:
s6切片的结果是:[2,3,4] 因为是从下标为2的元素(包含)开始取,到下标为5的元素(不包含)结束,取出3个元素,也就是长度为3。
现在将程序进行如下修改:
现在程序的输出结果是:
接下来输出切片array的值:
输出的结果如下:
发现切片array中的值也发生了变化,也就是修改切片s6的值会影响到原切片array的值,下面通过画图的形式来说明其原因。
在这里重点要理解的是:s6 := array[2:5],将array切片中的array[2],array[3],array[4]截取作为新切片s6,实际上是切片s6指向了原切片array(在这里并不是为切片s6新建一块区域)。所以修改s6,也会影响到array.
下面继续修改上面的程序:
以上程序中,切片s7的值是多少?
结果是:
下面也是通过画图的形式,来解释该程序的结果:
继续思考, 现在在原有的程序中又加了一行,如下图所示:
最终,切片s7与原来切片array的值分别是多少?
结果如下图所示:
继续思考:以上案例中,s6切片和s7切片的容量分别是多少?
切片截取
操作
含义
s[n]
切片s中索引位置为n的项
s[:]
从切片s的索引位置0到len(s)-1处所获得的切片
s[low:]
从切片s的索引位置low到len(s)-1处所获得的切片
s[:high]
从切片s的索引位置0到high处所获得的切片,len=high
s[low:high]
从切片s的索引位置low到high处所获得的切片,len=high-low
s[low : high : max]
从切片s的索引位置low到high处所获得的切片,len=high-low,cap=max-low
len(s)
切片s的长度,总是<=cap(s)
cap(s)
切片s的容量,总是>=len(s)
截取可表示为s[low:high:max]。low:表示下标的起点。 high:表示下标的终点(左闭右开,不包括此下标)。 长度 len = high – low。容量 cap = max – low。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len()和cap() 函数分别返回slice的长度和容量。
示例说明:
array := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
操作
结果
len
cap
说明
array[:6:8]
[0 1 2 3 4 5]
6
8
省略 low
array[5:]
[5 6 7 8 9]
5
5
省略 high、 max
array[:3]
[0 1 2]
3
10
省略 high、 max
array[:]
[0 1 2 3 4 5 6 7 8 9]
10
10
全部省略