初始化切片 s := make([]int, 3) 取 s[3:] 不会报越界错误,取 s[4:]就会越界了, 求教啊
1
Leigg 2019-10-03 18:25:51 +08:00 via Android
这个还真没碰见过,是冷知识?
|
2
c0011 2019-10-03 18:32:19 +08:00
s[3:] 是扩展切片,3 代表的是个数不是下标。
|
3
c0011 2019-10-03 18:39:00 +08:00
我上边的不对。可能就是语言的规定吧,3 代表最后一个元素并且是空(nil?)
|
4
kidlj 2019-10-03 18:42:26 +08:00
> For arrays or strings, the indices are in range if 0 <= low <= high <= len(a), otherwise they are out of range. For slices, the upper index bound is the slice capacity cap(a) rather than the length.
ref: https://golang.org/ref/spec#Slice_expressions 原因未知 :) |
6
kidlj 2019-10-03 19:00:16 +08:00 3
> The indices low and high select which elements of operand a appear in the result. The result has indices starting at 0 and length equal to high - low
> For convenience, any of the indices may be omitted. A missing low index defaults to zero; a missing high index defaults to the length of the sliced operand. 因此 s[3:] == s[3:len(a)] = s[3:3] ✓ s[4:] == s[4:len(a)] == s[4:3] x |
7
kidlj 2019-10-03 19:00:58 +08:00 1
@c0011
> the index x is in range if 0 <= x < len(a), otherwise it is out of range ref: https://golang.org/ref/spec#Index_expressions |
8
kidlj 2019-10-03 19:01:49 +08:00
修正:len(s) 不是 len(a)
|
9
gamexg 2019-10-03 19:27:15 +08:00 via Android 1
故意的吧,
如果 s[3:]就报错,就无法取末尾的空切片了。 |
10
Vegetable 2019-10-03 20:27:07 +08:00
错误信息是
panic: runtime error: slice bounds out of range [4:3] 6 楼说的应该就是正确答案了. |
11
shijiu 2019-10-03 22:40:12 +08:00
缺少的最高位是切片长度,而最高位是开区间,取 s[3:3]的话返回一个 0 长切片,应该是一个规定吧,方便判断。
就和 s[:0]返回一个 0 长切片一样? |
12
dreampuf 2019-10-04 00:36:00 +08:00
|
13
Carseason 2019-10-04 01:12:02 +08:00
s[3:3]
s[4:3] |