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

为什么恐慌不会发生?

为什么恐慌不会发生?

Go
汪汪一只猫 2022-05-05 17:37:25
我有以下代码: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 处结束?


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

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