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上运行


为什么是这样?


慕桂英3389331
浏览 152回答 2
2回答

繁花不似锦

表达式 array[2:] 计算为新的切片值。问题是应用程序假设新切片中的元素与 array.以下是解决该问题的几种方法。使用范围值:for _, v := range array[2:] {&nbsp; &nbsp;fmt.Printf("%d ", v)}索引到新切片:s := array[2:]for i := ranges s {&nbsp; &nbsp;fmt.Printf("%d ", s[i])}当从末尾开始切片时array[:5],新切片中的元素与 中的对应元素具有相同的索引array。

慕村225694

它确实有效,您只是在查看错误的切片。表达式array[2:]是一个新切片,从array.&nbsp;该切片的第 0 个元素是原始切片的第 2 个元素。这样做,你会看到:for&nbsp;i,value&nbsp;:=&nbsp;range&nbsp;array[2:]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf("%d&nbsp;",&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}i范围从 0 到 len(array)-2的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go