Go语言切片索引为何允许等于长度的上界,超出则报错?
为什么Go中
s[2:]返回空切片而s[3:]触发越界? 这其实是Go语言切片语法里特意设计的规则,我来给你拆解清楚:
首先看你的切片基础信息:s := []int{1,2},它的**长度(len)**是2(当前实际存储的元素数量),**容量(cap)**也是2(底层数组能容纳的最大元素数)。
Go对切片的[low:high]表达式有明确的边界约束:
- 必须满足
0 ≤ low ≤ high ≤ cap(s) - 当你省略
high参数时,它默认等于切片的len(s)
现在逐个分析你的例子:
s[2:]:这里low=2,high默认取len(s)=2。代入规则检查:0 ≤ 2 ≤ 2 ≤ 2,完全符合要求。此时新切片的长度是high - low = 0,容量是cap(s) - low = 0,自然返回空切片[],完全合法。s[3:]:这里low=3,high默认还是len(s)=2。首先3 > 2直接违反了low ≤ high的基本要求;其次3也超出了切片的容量上限2,所以必然触发切片越界错误。
这种设计其实很实用,比如你可以用s[len(s):]来获取一个空切片,后续直接用append往里面加元素,完全不用担心报错——这在动态扩展切片的场景里非常常见。
内容的提问来源于stack exchange,提问作者shreyas
相关产品推荐
相关产品推荐

