我有以下代码:package mainimport ( "fmt")func main() { primes := []int{2, 3, 5, 7, 11, 13} for i, _ := range primes { s := i + 1 fmt.Printf("%v => %v\n", s, primes[s:]) }}它产生以下值:1 => [3 5 7 11 13]2 => [5 7 11 13]3 => [7 11 13]4 => [11 13]5 => [13]6 => []问题是,为什么这里没有发生恐慌,它应该超出范围。为什么索引 6 有一个空切片?slice 像函数式编程中的列表吗?
1 回答
慕神8447489
TA贡献1780条经验 获得超1个赞
为方便起见,可以省略任何索引。缺失的
low
索引默认为零;缺少的high
索引默认为切片操作数的长度。对于数组或字符串,如果,则索引在范围内
0 <= low <= high <= len(a)
,否则超出范围。对于切片,索引上限是切片容量cap(a)
而不是长度。
索引从 开始0..len(primes)-1
,因此s := i+1
最大len(primes)
。
长度是允许的切片索引。primes[s:]
缺少high
索引,因此默认为len(primes)
, 并且primes[s:len(primes)]
有效,但当 . 时它将是一个空切片s == len(primes)
。
切片时,low
索引是包含的,并且high
是独占的,这就是长度是有效索引的原因:primes[:] = primes[0:len(primes)]
. 有关推理,请参阅相关问题:Go 切片索引符号背后的想法是什么?; 在 Go 切片中,为什么 s[lo:hi] 在元素 hi-1 处结束?
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消