首页 > 解决方案 > Go 在数组子切片上的内置范围具有不一致的行为

问题描述

为什么我们不能使用 builtrange来指示给定数组索引的下限,但我们可以指定索引的上限?

给定一片 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上运行

为什么是这样?

标签: arraysgorangeslice

解决方案


它确实有效,您只是在查看错误的切片。

表达式array[2:]是一个新切片,从array. 该切片的第 0 个元素是原始切片的第 2 个元素。这样做,你会看到:

for i,value := range array[2:] {
        fmt.Printf("%d ", value)
}

i范围从 0 到 len(array)-2的值。


推荐阅读