接下来说,思考如下题,定义一个切片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

全部省略