You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中数组切片range遍历的索引不符合预期问题

Go语言中数组切片range遍历的索引不符合预期问题

嗨,我完全懂你的困惑!你本来以为用range遍历数组切片a[4:]的时候,返回的索引会从原数组的4开始,但实际输出里索引却是从0起步的,这确实容易让人摸不着头脑。

咱们先看你的原代码:

var a = [8]int{0, 1, 2, 3, 4, 5, 6, 7}
for i, v := range a[4:] {
    fmt.Printf("[idx=%d val=%d] ", i, v)
}

输出结果是:

[idx=0 val=4] [idx=1 val=5] [idx=2 val=6] [idx=3 val=7]

问题出在a[4:]这个操作上——它并不是直接“跳过原数组前4个元素遍历”,而是创建了一个新的切片。这个新切片的底层数组虽然还是原数组a,但它自己的起始位置是原数组的第4个元素,长度为4。而range遍历切片时,返回的索引是相对于这个新切片自身的位置,不是原数组的索引,所以第一个元素的索引就是0,对应原数组的第4个元素。

如果想要得到原数组的索引,有两种简单的解决办法:

  • 方法一:给range返回的索引加上切片的起始偏移量
    你可以先把起始偏移量存起来,遍历的时候把它和range返回的索引相加,就能得到原数组的索引了:

    var a = [8]int{0, 1, 2, 3, 4, 5, 6, 7}
    startIdx := 4
    for i, v := range a[startIdx:] {
        fmt.Printf("[原数组idx=%d val=%d] ", i+startIdx, v)
    }
    

    这样输出就会是你预期的:[原数组idx=4 val=4] [原数组idx=5 val=5] [原数组idx=6 val=6] [原数组idx=7 val=7]

  • 方法二:直接遍历原数组的索引范围
    如果你不需要切片,也可以直接从索引4开始遍历原数组,这样拿到的就是原数组的索引和对应值:

    var a = [8]int{0, 1, 2, 3, 4, 5, 6, 7}
    for i := 4; i < len(a); i++ {
        fmt.Printf("[idx=%d val=%d] ", i, a[i])
    }
    

    输出结果和上面一致。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:48:13