去切片 - 容量/长度?

现在尝试从教程中学习 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?很困惑。


红颜莎娜
浏览 186回答 2
2回答

潇湘沐

官方文档提到了这一点。切片的长度是它包含的元素数。切片的容量是底层数组中元素的数量,从切片中的第一个元素开始计数。所以对于你的第一个问题:为什么 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 个元素。对于您的第二个问题:为什么容量是d3正如@Akavall 提到的评论者之一。容量,是切片可以访问的第一个元素和底层数组的最后一个元素之间的元素数。因此,在您的情况下,您的切片d可以访问的第一个元素是数组的第二个位置元素,底层数组的最后一个元素是第 5 个位置。所以 5-2 是 3。我在此附上了切片访问数组的官方图示。官方文档中进一步提供了更多关于切片的初始化和创建示例。 https://tour.golang.org/moretypes/13

慕斯王

你所有的变量都有一个切片类型。切片有一个支持数组。在 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因切割片将产生一个新的切片,其共享相同的底层实现数组,容量将是直到最后的第一个元素支持数组(除非您使用完整的切片表达式,该表达式还控制生成的切片的容量)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go