为什么 Go 中切片可以被切片到底层数组的长度?
Go 数组和切片提供了便捷的使用方式数据收集。一个可能看起来令人惊讶的特殊行为是能够将切片切成其长度而不是其容量。为了理解这一点,让我们深入研究 Go 规范。
根据 Go 规范的切片表达式部分,对于数组或字符串,如果满足以下条件,则认为索引在范围内:
0 <= low <= high <= len(a)
如果指数超出此范围,则被视为超出范围。然而,对于切片来说,上索引界限是切片容量,用 cap(a) 表示,而不是长度,用 len(a) 表示。
这意味着对切片的以下切片操作a 最多允许 len(a)(包括 len(a)):
a[0:] a[1:] a[2:]
在这些情况下,生成的切片从索引 0 开始,长度为 0,分别为 1 和 2。
但是,超出 a 长度的切片会导致恐慌:
a[3:] // Doesn't panic (empty slice) a[4:] // Panics
a[3:] 切片不会恐慌,因为索引为 3位于 [0, len(a)] 范围内,即使它会导致空切片。另一方面,a[4:] 会发生恐慌,因为索引 4 超出了范围,其中范围定义为 [0, len(a))。
因此,Go 允许切片的长度为底层数组,因为规范明确指出切片的索引上限是由容量而不是长度定义的。这种行为可以实现方便的切片操作,而不会在常见场景中引起意外的恐慌。
以上是为什么 Go 切片可以被切片到它们的长度,而不仅仅是它们的容量?的详细内容。更多信息请关注PHP中文网其他相关文章!