"上限" Golang

时间:2016-03-24 11:52:48

标签: arrays go slice

以下代码:

var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
slice := numbers4[4:6:8] 
fmt.Printf("%d\n", cap(slice))

为什么cap(slice)等于4

我以前认为应该是2

2 个答案:

答案 0 :(得分:4)

numbers4[4:6:8]full slice expression

  

对于数组,指向数组或切片a(但不是字符串)的指针,主表达式

a[low : high : max]
     

构造一个相同类型的切片,并且具有与简单切片表达式a[low : high]相同的长度和元素。此外,通过将切片的容量设置为max - low 来控制切片的容量。

规范说完整切片表达式控制容量,将其限制为max - low,在您的情况下为8 - 4 = 4

容量"额外"切片可以扩展的元素,容量是切片可以扩展到的最大长度,包括当前长度+超出长度的额外元素。

slice := numbers4[4:6:8]

len(slice) = 6 - 4 = 2
cap(slice) = 8 - 4 = 4

答案 1 :(得分:3)

  

容量是底层数组中的元素数   (从切片指针引用的元素开始)。

来自Go Slices: usage and internals

基本上,这意味着上限!= len 因此,切片从#4开始,到#8结束,因此,上限为df <- data.frame(A=c('TWO','ONE','THREE','ONE','TWO'),B=c('ONE','ONE','TWO','TWO','THREE'),C=c('THREE','TWO','THREE','ONE','TWO'),stringsAsFactors=F); sapply(df,table); ## A B C ## ONE 2 2 1 ## THREE 1 1 2 ## TWO 2 2 2