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:]也应该出错。
答案 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}},这会产生结果在长度为2
(0
)
答案 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]={}