为了账号安全,请及时绑定邮箱和手机立即绑定

Go 在数组子切片上的内置范围具有不一致的行为

Go 在数组子切片上的内置范围具有不一致的行为

Go
慕桂英3389331 2022-10-10 19:15:23
为什么我们不能使用 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上运行为什么是这样?
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

表达式 array[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。


查看完整回答
反对 回复 2022-10-10
?
慕村225694

TA贡献1880条经验 获得超4个赞

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

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

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

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


查看完整回答
反对 回复 2022-10-10
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信