使用Go语言循环索引来遍历切片

10

我有一个相当简单的问题,但却找不到答案。我正在遍历一系列切片,如下所示:

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

据我理解,range遍历一个切片,而index是从range创建出来的,并且它是从零开始计数的。 我得到了以下输出:

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语言风格"的方法来做这件事情?同时,在Go语言中如何保留索引来创建切片?


在你的shift示例中,除了for循环的常规增量之外,每次还将索引加1。这不会导致只读取参数1、3、5等吗? - Matei Radu
2
@MateiRadu 不,索引在每次循环中都被重新分配,所以代码可以正常工作。不过使用一个新变量,比如 originalIndex := index + 1,可能会更好看些。 - Franck Jeannin
@FranckJeannin 谢谢你的解释,它解开了我对range如何工作的疑惑。 - Matei Radu
1个回答

7

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

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

谢谢你的回答! - Damaged Organic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接