8.6. 切片的操作
切片的操作
上一小节中,已经完成了切片的定义,赋值等操作,接下来看一下关于切片的其它操作。首先说一下切片的截取操作,所谓截取就是从切片中获取指定的数据
切片截取
我们来写一个demo:
定义一个切片
//定义了切片,并且完成初始化
s := []int{ 10,20,30,0,0}
//从切片s中截取数据
slice := s[0:3:5]
fmt.Println (slice)
以上程序输出结果
[10 20 30]
s
[0
:3
:5
]是什么意思呢?
我们可以使用s
[low
:high
:max
]来表示
第一个数(low)表示下标的起点(从该位置开始截取),如果low取值为0表示从第一个元素开始截取,也就是对应的切片s中的10
第二个数(high)表示取到哪结束,也就是下标的终点(不包含该位置),3表示取出下标是0,1,2的数据(10,20,30),不包括下标为3的数据,那么也就是说取出的数据长度是3. 可以根据公式:3-0 计算(len=high-low),也就是第二个数减去第一个数,差就是数据长度。在这里可以将长度理解成取出的数据的个数。
第三个数用来计算容量,所谓容量:是指切片目前可容纳的最多元素个数。通过公式5-0计算(cap=max-low),也就是第三个数据减去第一个数。该案例中容量为5
那么我们可以测试一下修改:
定义一个切片
//定义了切片,并且完成初始化
s := []int{ 10,20,30,40,50}
//从切片s中截取数据
slice := s[0:3:5]
fmt.Println (slice)
此时程序输出结果
[10 20 30]
因为起点还是0,终点还是3. 长度是3,容量是5。
那么容量
是多少呢?容量为4,通过第三个数减去第一个数(5-1)计算。
通过画图的方式来表示slice切片中的容量。
通过上面的图,可以发现切片s经过截取操作以后,将结果赋值给切片slice后,长度是3,容量是4,只不过有一块区域是空闲的。
其他操作
关于切片的截取还有其它的操作
操作 | 含义 |
---|---|
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) |
下面我们上演示代码:
func main() {
slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
//切片名[起始位置:结束位置+1] 切片名[low:high]
//s:=slice[3:7]
//容量=max-low
//切片名[起始位置:结束位置+1:容量] 切片名[low:high:max]
//s:=slice[3:7:7]
//切片名[起始位置:] 从起始位置到结束
//s:=slice[2:]
//切片名[:结束位置+1]
//s:=slice[:5]
//s:=slice[:]
s := slice
fmt.Println(s)
//容量要大于等于长度
//fmt.Println(len(s))
//fmt.Println(cap(s))
}
输出结果 建议自己动手 一下。