8.6. 切片的操作

未匹配的标注
本文档最新版为 2023,旧版本可能放弃维护,推荐阅读最新版!

切片的操作

上一小节中,已经完成了切片的定义,赋值等操作,接下来看一下关于切片的其它操作。首先说一下切片的截取操作,所谓截取就是从切片中获取指定的数据

切片截取

我们来写一个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))

}

输出结果 建议自己动手 一下。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~