为什么切片在索引1的作用超过长度而不是更远

时间:2018-04-19 02:05:04

标签: go slice

package main

import (
    "fmt"
)

func main() {
    s:= []int{1,2}
    fmt.Println(s[0:]) // this is expected
    fmt.Println(s[1:]) // this is expected
    fmt.Println(s[2:]) // this wondering why i didn't recieve slice bounds out of range error
    fmt.Println(s[3:]) // here i recieve the error
}

有人可以解释为什么s [2:]返回空slice []但s [3:]错误输出。我认为s [2:]也应该出错。

2 个答案:

答案 0 :(得分:1)

基于The Go Programming Language Specifications

  

对于数组或字符串,如果0< = low< = high< = len(a),则索引在范围内,否则它们超出范围。对于切片,上限索引边界是切片容量上限(a)而不是长度。

https://golang.org/ref/spec#Slice_expressions

s[3:]会出错,因为您的low索引(即3)大于len(s)(即2),因此out of range

  

索引低和高选择操作数a的哪些元素出现在结果中。结果指数从0开始,长度等于高 - 低

s[2:]为您提供一个空切片,因为您的low索引(为2)和您的high索引(默认为go {4}},这会产生结果在长度为20

的切片中

答案 1 :(得分:1)

0     1     2    n-1    n
|_____|_____|_..._|_____|
 s[0]  s[1]        s[n-1]

我从一本golang书中找到了这个解释。以上是指数,下面是元素。

我们可以看到n在获取子句时也是一个有效的索引,这可以解释为什么s[a:b]={s[a], s[a+1], ... , s[b-1]}s[n:]=s[n:n]={}