切片不会在长度上惊慌,但在获得索引值等于长度时会惊慌

时间:2019-02-27 08:42:00

标签: string go indexing

我有一个string,当我想获取i索引处的值时会感到恐慌,但是当我从同一string切出时,将较低的索引值保留为长度,则它不会惊慌。想知道1和2有何不同?

func main() {
    str := "a"
    fmt.Println(str[1])  // 1 this panics
    fmt.Println(str[1:]) // 2 this doesn't
}

1 个答案:

答案 0 :(得分:3)

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

index expression中,索引必须在范围内,否则会出现混乱。如果为0 <= i < length,则索引在范围内。引用规范:

  

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

中      

如果a不是地图:

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

并且:

  

对于string type中的a:

     

您的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)]的{​​{1}}相同。结果字符串的长度为str[1:1]:空的high - low = 1 - 1 = 0