【问题标题】:Why panic does not occur?为什么恐慌不会发生?
【发布时间】:2020-01-15 13:28:48
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • 没有理由恐慌,可以创建一个空的子切片,即使在切片的末尾也是如此。 “切片就像函数式编程中的列表吗?”没有。
  • 为什么是空的?这就是重点,我不明白。
  • prines 中有 6 个元素,并且 [6:6](或 [6:])是有效切片。不过它是空的。
  • 从6m开始到6m结束要跑多少米:0米。
  • @Volker 哇很好的解释。

标签: go slice


【解决方案1】:

Spec: Slice expressions:

为方便起见,可以省略任何索引。缺少的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)]。推理见相关问题:What is the idea behind the notation of indices of Go slices?;和In a Go slice, why does s[lo:hi] end at element hi-1?

【讨论】:

  • 为什么primes[s:s] 会得到一个空切片?
  • @zero_coding 我编辑为primes[s:len(primes)]s == len(primes) 为空。
  • @zerocoding "切片时,低索引包含,高索引排除" 意思是如果它们都是相同的索引,则排除唯一的索引,因此结果为0元素切片
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2019-05-10
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 2017-11-11
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多