2 回答
TA贡献1816条经验 获得超6个赞
官方文档提到了这一点。
切片的长度是它包含的元素数。
切片的容量是底层数组中元素的数量,从切片中的第一个元素开始计数。
所以对于你的第一个问题:
为什么 c 看起来像 [0,0] 并且长度为 2?
您的切片c
是用 b[:2]
它创建的,这意味着它具有切片的 0th 到 1st 位置的元素b
。因此它只有 2 个元素,因此长度为 2。
因此,没有设置
c
到b[:2]
零出前两个元素?(因为b was
[]`)
现在正如@icza 提到的那样go
,默认情况下将它们初始化为 0。通过设置c:=b[:2]
您将 b 初始化为在其容量 5 中包含 2 个元素。
对于您的第二个问题:
为什么容量是
d
3
正如@Akavall 提到的评论者之一。
容量,是切片可以访问的第一个元素和底层数组的最后一个元素之间的元素数。
因此,在您的情况下,您的切片d
可以访问的第一个元素是数组的第二个位置元素,底层数组的最后一个元素是第 5 个位置。所以 5-2 是 3。
我在此附上了切片访问数组的官方图示。
官方文档中进一步提供了更多关于切片的初始化和创建示例。 https://tour.golang.org/moretypes/13
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
因切割片将产生一个新的切片,其共享相同的底层实现数组,容量将是直到最后的第一个元素支持数组(除非您使用完整的切片表达式,该表达式还控制生成的切片的容量)。
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报