简介
在 Go 中,当对数组或切片进行切片时,人们可能会预期会导致超出基础数组或切片的长度 恐慌中。然而,对于切片来说,这种行为却奇怪地不同。
问题
考虑下面的 Go 代码:
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // Surprisingly, doesn't panic fmt.Println(a[4:]) // Panics as expected
令人困惑的是切片是[3:] 不会产生恐慌,即使它看起来超过了长度数组。
答案
此行为由 Go 语言规范规定:
在我们的示例中,a是一个数组,其长度为3。但是,拼接到数组的长度,即 a[3:] 被认为在有效范围内,因为底层数组的长度为 3。
正如规范所解释的,“索引上限是切片容量 cap(a) 而不是长度。”因此,在本例中,a[3:] 创建一个空切片,因为 high - low = 3 - 3 = 0。
一个关键区别
重要的是请注意,使用超出切片容量的索引(即我们示例中的 a[4:])仍然超出范围,并将导致运行时恐慌。规范明确指出:“如果运行时索引超出范围,则会发生运行时恐慌。”
以上是为什么 Go Slices 中不会出现 `a[len(slice)]` 恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!