猿问

为什么恐慌不会发生?

我有以下代码:


package main


import (

    "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 像函数式编程中的列表吗?


汪汪一只猫
浏览 115回答 1
1回答

慕神8447489

规格:切片表达式:为方便起见,可以省略任何索引。缺失的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)].&nbsp;有关推理,请参阅相关问题:Go 切片索引符号背后的想法是什么?;&nbsp;在 Go 切片中,为什么 s[lo:hi] 在元素 hi-1 处结束?
随时随地看视频慕课网APP

相关分类

Go
我要回答