为什么这段代码不会抛出错误“索引超出范围”?
func main() {
l := make([]int, 0)
l = append(l, 1)
fmt.Println(l)
l = l[1:] // cut first, but an element with this index does not exist
}
从切片末尾开始切片是合法的,导致切片为空:
fmt.Println(l[1:]) // "[]"
不允许在结束后切片:
fmt.Println(l[2:]) // panic: runtime error: slice bounds out of range [2:1]
这是有道理的:给定
l[0:]
返回一个包含 1 个元素的切片,您会期望 l[1:]
返回一个少 1 个元素的切片 - 即一个包含 0 个元素的切片。
按照这个思路,你会期望
l[2:]
返回一个 -1 元素的切片,这是不可能的,会因恐慌而爆炸......正如预期的那样。
非常感谢您的回复。我知道诀窍是数组的容量。 Go 中的子切片允许您切片超出切片末尾,只要它仍在底层数组的容量范围内即可。