切片范围的循环索引
Go loop indices for range on slice
我有一个相当简单的问题,但无法在任何地方找到答案。我正在遍历一系列切片,如下所示:
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 中创建切片时保留索引?
您的原始代码没有任何问题,当您执行 os.Args[1:]
时,您正在创建一个新切片,就像任何切片一样从索引 0 开始。
这是风格(和性能)的问题,但您也可以这样做:
for index, arg := range os.Args {
if index < 1 {
continue
}
s += fmt.Sprintf("%d: %s", index, arg)
}
我有一个相当简单的问题,但无法在任何地方找到答案。我正在遍历一系列切片,如下所示:
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 中创建切片时保留索引?
您的原始代码没有任何问题,当您执行 os.Args[1:]
时,您正在创建一个新切片,就像任何切片一样从索引 0 开始。
这是风格(和性能)的问题,但您也可以这样做:
for index, arg := range os.Args {
if index < 1 {
continue
}
s += fmt.Sprintf("%d: %s", index, arg)
}