切片范围的循环索引

Posted

技术标签:

【中文标题】切片范围的循环索引【英文标题】:Go loop indices for range on slice 【发布时间】:2017-05-17 15:30:09 【问题描述】:

我有一个相当简单的问题,但在任何地方都找不到答案。我正在迭代一系列切片,如下所示:

for index, arg := range os.Args[1:] 
    s += fmt.Sprintf("%d: %s", index, arg)

据我了解,range 迭代切片,index 是从范围创建的,它是从零开始的。我得到了输出:

0: argument_1
1: argument_2
// etc.

但这不是我所期望的 - 我需要 range 来保留该切片的索引,所以我的输出如下所示:

1: argument_1
2: argument_2
// etc.

实现这一点最明显的方法是在循环中的索引上添加shift

shift := 1
for index, arg := range os.Args[shift:] 
    index += shift
    s += fmt.Sprintf("%d: %s", index, arg)

但我想知道,是否有更多“Go-ish”方式来执行此操作,以及在像这样在 Go 中创建切片时如何保留索引?

【问题讨论】:

在您的 shift 示例中,除了通常的 for 循环增量之外,您每次都向索引添加 1。这难道不能解决只读参数 1、3、5 等问题吗? @MateiRadu 不,为每个循环重新分配索引,以便代码正常工作。使用像 originalIndex := index + 1 这样的新变量可能看起来会更好 @FranckJeannin 感谢您的解释,它消除了我对range 工作原理的疑虑。 【参考方案1】:

您的原始代码没有任何问题,当您执行 os.Args[1:] 时,您正在创建一个新切片,该切片与任何切片一样从索引 0 开始。 这是风格(和性能)的问题,但您也可以这样做:

for index, arg := range os.Args 
    if index < 1 
        continue
    
    s += fmt.Sprintf("%d: %s", index, arg)

【讨论】:

感谢您的回答!

以上是关于切片范围的循环索引的主要内容,如果未能解决你的问题,请参考以下文章

当切片索引超出范围时如何引发 IndexError?

为啥索引超出范围的子字符串切片有效?

使用索引/范围对数组进行切片是不是会创建数组的副本

golang 循环切片通过golang中的切片使用范围

Python高级特性

InvalidArgumentError:维度 0 的切片索引 5 超出范围。 [Op:StridedSlice] 名称:strided_slice/