Go语言切片越界切片表达式不触发panic的原因咨询
为什么Go切片
is[2:]不触发panic,但is[3:]和is[2]会? 这其实是Go语言对切片表达式和直接索引访问的规则差异导致的,咱们一步步拆解清楚:
首先先明确你这个切片的基础属性:
is := []int{1, 2} // len(is) = 2,cap(is) = 2
1. 为什么is[2:]不panic?
Go的切片表达式a[low:high]有自己的规则:low和high的取值范围是0 ≤ low ≤ high ≤ cap(a)。只要满足这个条件,表达式就不会触发panic,哪怕high超过了当前切片的len(a)。
在is[2:]里,low=2,high默认取原切片的len(is)=2,所以相当于is[2:2]。此时生成的新切片长度是2-2=0,是一个空切片——因为没有试图访问任何具体的元素,只是创建了一个长度为0的切片结构,所以不会触发panic。
2. 为什么is[3:]会panic?
同样套用切片表达式的规则,high的上限是原切片的容量cap(is)=2,而is[3:]里的high=3已经超过了这个容量上限,违反了语法规则,所以直接触发panic。
3. 为什么is[2]会panic?
直接通过索引访问切片元素的规则和切片表达式完全不同:索引必须满足0 ≤ index < len(a)。这里原切片的len(is)=2,合法索引只有0和1,index=2明显超出了这个范围,自然会触发索引越界的panic。
简单总结一下:
- 切片表达式只要
low和high在0到容量之间,哪怕超过当前长度,只要生成的新切片为空(或后续不访问新切片的越界元素),就不会panic; - 直接索引访问必须严格落在当前切片的长度范围内;
- 切片表达式的
high绝对不能超过原切片的容量,否则必然panic。
内容的提问来源于stack exchange,提问作者Ganeshdip
相关产品推荐
相关产品推荐

