切片不会在长度上出现恐慌,但在获得索引值等于长度时会发生恐慌

问题描述 投票:-2回答:1

我有一个string,当我想获得i指数的值时,它会发生恐慌,但当我切出相同的string保持较低的索引值作为长度时,它不会恐慌。想知道1和2有何不同?

func main() {
    str := "a"
    fmt.Println(str[1])  // 1 this panics
    fmt.Println(str[1:]) // 2 this doesn't
}
string go indexing
1个回答
3
投票

TLDR;在索引表达式中,索引必须小于长度,并且在切片表达式中,length是有效索引。

index expression中,指数必须在范围内,否则恐慌。如果0 <= i < length,该指数在范围内。引用规范:

在索引表达式a[x]中......

如果a不是地图:

  • 如果x,指数0 <= x < len(a)在范围内,否则它超出范围

和:

对于string type

你的str字符串变量存储一个string值,它有一个字节:'a'。索引从零开始,因此单个字节具有索引0。它的长度是1,因此在1指数中没有元素。

slice expression

a[low : high]

对于数组或字符串,如果0 <= low <= high <= len(a),则索引在范围内,否则它们超出范围。

在切片表达式中,长度是有效索引。所以在你的情况下像str索引str[1:]将导致一个空字符串:""

在切片表达式a[low : high] ...

结果的指数从0开始,长度等于high - low

丢失的low索引默认为零;缺少的high索引默认为切片操作数的长度。

所以str[1:]str[1:len(str)]str[1:1]相同。结果字符串的长度为high - low = 1 - 1 = 0:空string

© www.soinside.com 2019 - 2024. All rights reserved.