切片范围的 Go 循环索引

Dam*_*nic 5 loops go slice indices

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

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

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

0: argument_1
1: argument_2
// etc.
Run Code Online (Sandbox Code Playgroud)

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

1: argument_1
2: argument_2
// etc.
Run Code Online (Sandbox Code Playgroud)

最明显的方法是shift在循环中添加索引:

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

但我想知道,是否有更多的“Go-ish”方式来做到这一点,以及如何在像这样在 Go 中创建切片时保留索引?

Fra*_*nin 7

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

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