在 Go 中,为什么 a[1:] 对于容量 = 1 的切片不会给出索引越界错误?

0 arrays go slice

为什么以下代码不会给出“切片边界超出范围”错误?

a := []int{0}
a = a[1:]
fmt.Println(a) // []
Run Code Online (Sandbox Code Playgroud)

ANi*_*sus 5

因为切片表达式的 Go 规范指出:

对于字符串、数组、数组指针或切片 a,主表达式

一个[低:高]

构造一个子字符串或切片。

...

为了方便起见,可以省略任何索引。缺失的低指数默认为零;缺失的高索引默认为切片操作数的长度:

a[2:] // 与 a[2 : len(a)] 相同

...

对于数组或字符串,如果 0 <= low <= high <= len(a),则索引在范围内,否则索引超出范围。

在您的情况下,len(a)是 1,并且a[1:]与 相同a[1:1],这意味着它在范围内。