gpt4 book ai didi

go - slice 索引奇怪的边缘情况

转载 作者:行者123 更新时间:2023-12-01 22:40:33 25 4
gpt4 key购买 nike

在 Go 中, slice 索引使用半开范围。对于 a[low:high], slice 包括 a[low] 但不包括 a[high]。引用:https://tour.golang.org/moretypes/7 .另一种思考方式是它从 a[low] 到 a[high-1] 包含在内。

但是看看这段代码。您可以在以下位置运行它:https://play.golang.com/p/DSLs7V8gom0

func main() {
t := []int{5}
fmt.Println(t)
fmt.Println(t[0:0])
fmt.Println(t[1:1])
}

如果您运行代码,您可以看到 t[0:0] 和 t[1:1] 都是有效且允许的。

t[0:0] 表示包括 t[0] (存在)但在 t[0] 之前停止(即 t[-1] 不存在)。

t[1:1] 表示包括 t[1] (不存在)但在 t[1] 之前停止(即 t[0] 存在)。

在这两种情况下,其中一个索引指的是不存在的东西,即索引超出范围 ==> 但在语法上完美并在 Golang 中允许!

但是,如果您尝试任何其他索引,例如 t[2],编译器预计会大声提示。

最佳答案

您需要将范围视为从较低值开始并在达到较高值时停止。上限永远不能小于下限,但它们可以是任何有效的索引或结束后的索引 - 即在您的示例中为 0 或 1。

所以t[0:0]表示开始然后立即停止,给出一个零长度范围。例如:
t[0:0]t[1:1]是有效的零长度 slice
t[0:1]是长度为 1 的 slice
t[2:2]t[1:0]无效

我在我的博客中详细解释了半开范围的优点,并且没有将零作为特例 - 例如参见 http://devmethodologies.blogspot.com/2012/12/asymmetric-bounds-and-zero-based.html

关于go - slice 索引奇怪的边缘情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60690421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com