切片上的范围的循环索引

时间:2017-01-03 13:59:18

标签: loops go slice indices

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

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中创建切片时保留索引?

1 个答案:

答案 0 :(得分:3)

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

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