3 回答
TA贡献1802条经验 获得超10个赞
引用规范:切片表达式:
对于数组或字符串,如果,则索引在范围内
0 <= low <= high <= len(a)
,否则它们超出范围。对于切片,索引上限是切片容量cap(a)
而不是长度。
所以本说明书中允许使用指数高达len(a)
底层的阵列,len(a)
包括(或cap(a)
在在这种情况下具有相同的值的切片的情况下)。这就是为什么a[3:]
在你的情况下不恐慌。
但它当然会产生一个空切片,因为:
a[low : high]
意味着结果的索引从 at 开始,0
长度等于high - low
and 由于high
被省略,它默认为len(a)
so len(a) - len(a) = 0
。
而且(根据规范)使用索引> len(a)
将超出范围,因此会导致运行时恐慌:
如果索引在运行时超出范围,则会发生运行时恐慌。
TA贡献1852条经验 获得超7个赞
a[3:] 构建一个空切片,它就像一个空数组一样,是一个有效且有用的对象(在所有语言中,不仅仅是在 Go 中)。
空切片也仍然指向底层数组、位置和容量,有时可以扩展:
a := []int{1, 2, 3}
emptySlice := a[1:1]
fmt.Println(emptySlice) // []
notEmpty := emptySlice[0:2]
fmt.Println(notEmpty) // [2 3]
另一方面,具有负长度的切片是不一致的。它没有任何意义,因此被禁止。
TA贡献1921条经验 获得超9个赞
因为在切片中有0元素 ( 3-3) 是完全有效的。但是有-1元素 ( 3-4) 不是。
这种行为也与其他语言一致。例如,Java:
System.out.println(Arrays.asList(1, 2, 3).subList(0, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(1, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(2, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(3, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(4, 3));
只有最后一个语句失败。
- 3 回答
- 0 关注
- 248 浏览
添加回答
举报