Go 在数组子切片上的内置范围具有不一致的行为
Go's built-in range on a sub-slice of an array has incongruent behavior
为什么我们不能使用内置的 range
指定给定数组索引的下限,但我们可以指定索引的上限?
给定一片 int:
array := []int{4, 76, -29, 3, 9, 223, 0, -3, -44, 76, 3, 98, 62, 144}
我想遍历切片,不包括前两个元素。
我可以用 for 循环来做到这一点:
for i := 2; i < len(array); i++ {
fmt.Printf("%d ", array[i])
}
但不能使用内置 range
:
for i := range array[2:] {
fmt.Printf("%d ", array[i])
}
奇怪的是,我 可以 排除范围上限的元素,如下所示:
for i := range array[:5] {
fmt.Printf("%d ", array[i])
}
运行 它在 Go Playground
这是为什么?
它确实有用,你只是看错了切片。
表达式 array[2:]
是从 array
的第 2 个元素开始的新切片。该切片的第 0 个元素是原始切片的第二个元素。这样做,您会看到:
for i,value := range array[2:] {
fmt.Printf("%d ", value)
}
i
的值范围从 0 到 len(array)-2。
表达式数组[2:] 的计算结果为新的切片值。问题在于应用程序假定新切片中的元素与 array
.
中的对应元素具有相同的索引
这里有几个解决问题的方法。
使用范围值:
for _, v := range array[2:] {
fmt.Printf("%d ", v)
}
新切片的索引:
s := array[2:]
for i := ranges s {
fmt.Printf("%d ", s[i])
}
当array[:5]
中从末尾开始切片时,新切片中的元素与array
中的相应元素具有相同的索引。
为什么我们不能使用内置的 range
指定给定数组索引的下限,但我们可以指定索引的上限?
给定一片 int:
array := []int{4, 76, -29, 3, 9, 223, 0, -3, -44, 76, 3, 98, 62, 144}
我想遍历切片,不包括前两个元素。
我可以用 for 循环来做到这一点:
for i := 2; i < len(array); i++ {
fmt.Printf("%d ", array[i])
}
但不能使用内置 range
:
for i := range array[2:] {
fmt.Printf("%d ", array[i])
}
奇怪的是,我 可以 排除范围上限的元素,如下所示:
for i := range array[:5] {
fmt.Printf("%d ", array[i])
}
运行 它在 Go Playground
这是为什么?
它确实有用,你只是看错了切片。
表达式 array[2:]
是从 array
的第 2 个元素开始的新切片。该切片的第 0 个元素是原始切片的第二个元素。这样做,您会看到:
for i,value := range array[2:] {
fmt.Printf("%d ", value)
}
i
的值范围从 0 到 len(array)-2。
表达式数组[2:] 的计算结果为新的切片值。问题在于应用程序假定新切片中的元素与 array
.
这里有几个解决问题的方法。
使用范围值:
for _, v := range array[2:] {
fmt.Printf("%d ", v)
}
新切片的索引:
s := array[2:]
for i := ranges s {
fmt.Printf("%d ", s[i])
}
当array[:5]
中从末尾开始切片时,新切片中的元素与array
中的相应元素具有相同的索引。