为了账号安全,请及时绑定邮箱和手机立即绑定

去切片 - 容量/长度?

去切片 - 容量/长度?

Go
红颜莎娜 2022-01-04 15:55:46
现在尝试从教程中学习 Go,并有一个非常基本的问题: func main() {  a := make([]int, 5)  // [0,0,0,0,0] len=5 cap=5  b := make([]int, 0, 5)  // [] len=0 cap=5  c := b[:2]  // [0,0] len=2 cap=5  d := c[2:5]  // [0,0,0] len=3 cap=3}为什么c看起来像[0,0]并且长度为 2?b最初没有归零,因此它是[]. 因此,没有设定c到b[:2]零了前两个要素是什么?另外,为什么容量是d3?很困惑。
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

官方文档提到了这一点。

切片的长度是它包含的元素数。

切片的容量是底层数组中元素的数量,从切片中的第一个元素开始计数。

所以对于你的第一个问题:

为什么 c 看起来像 [0,0] 并且长度为 2?

您的切片c是用 b[:2]它创建的,这意味着它具有切片的 0th 到 1st 位置的元素b。因此它只有 2 个元素,因此长度为 2。

因此,没有设置cb[:2]零出前两个元素?(因为b was []`)

现在正如@icza 提到的那样go,默认情况下将它们初始化为 0。通过设置c:=b[:2]您将 b 初始化为在其容量 5 中包含 2 个元素。

对于您的第二个问题:

为什么容量是d3

正如@Akavall 提到的评论者之一。

容量,是切片可以访问的第一个元素和底层数组的最后一个元素之间的元素数。

因此,在您的情况下,您的切片d可以访问的第一个元素是数组的第二个位置元素,底层数组的最后一个元素是第 5 个位置。所以 5-2 是 3。

我在此附上了切片访问数组的官方图示。

//img1.sycdn.imooc.com//61d425ae00010aac05180189.jpg

官方文档中进一步提供了更多关于切片的初始化和创建示例。 https://tour.golang.org/moretypes/13


查看完整回答
反对 回复 2022-01-04
?
慕斯王

TA贡献1864条经验 获得超2个赞

你所有的变量都有一个切片类型。切片有一个支持数组。在 Go 中,您无法访问未初始化的变量。如果在创建新变量时没有明确提供值,它们将被初始化为变量类型的零值

这意味着当您创建一个切片时make([]int, 0, 5),它也会创建一个支持数组,支持数组将被初始化为零值,并且这个归零数组将被切片。数组类型的零值是一个数组,其每个元素都具有元素类型的零值。

因此,即使您没有将支持数组的每个元素显式设置为0,它们也会自动归零。因此,当您这样做时c := b[:2],它将切片b切片,并且c长度为 2,而这 2 个元素将为0.

当你这样做d := c[2:5]是片的c切片,其长度将是5-2 = 3,其容量也将5-2 = 3因切割片将产生一个新的切片,其共享相同的底层实现数组,容量将是直到最后的第一个元素支持数组(除非您使用完整的切片表达式,该表达式还控制生成的切片的容量)。


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信