为什么这段golang代码中没有“index out of range”错误? [重复]

问题描述 投票:0回答:2

为什么这段代码不会抛出错误“索引超出范围”?

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
}
go slice
2个回答
2
投票

从切片末尾开始切片是合法的,导致切片为空:

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 元素的切片,这是不可能的,会因恐慌而爆炸......正如预期的那样。


-1
投票

非常感谢您的回复。我知道诀窍是数组的容量。 Go 中的子切片允许您切片超出切片末尾,只要它仍在底层数组的容量范围内即可。

© www.soinside.com 2019 - 2024. All rights reserved.