Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 切片上范围的Go循环索引_Loops_Go_Slice_Indices - Fatal编程技术网

Loops 切片上范围的Go循环索引

Loops 切片上范围的Go循环索引,loops,go,slice,indices,Loops,Go,Slice,Indices,我有一个相当简单的问题,但到处都找不到答案。我在一系列切片上进行迭代,如下所示: for index, arg := range os.Args[1:] { s += fmt.Sprintf("%d: %s", index, arg) } 1: argument_1 2: argument_2 // etc. 据我所知,range在一个切片上迭代,index是从range创建的,它是基于零的。我得到输出: 0: argument_1 1: argument_2 // etc. 但这

我有一个相当简单的问题,但到处都找不到答案。我在一系列切片上进行迭代,如下所示:

for index, arg := range os.Args[1:] {
    s += fmt.Sprintf("%d: %s", index, arg)
}
1: argument_1
2: argument_2
// etc.
据我所知,
range
在一个切片上迭代,
index
是从range创建的,它是基于零的。我得到输出:

0: argument_1
1: argument_2
// etc.
但这不是我所期望的-我需要
range
来保存该切片的索引,因此我的输出如下所示:

for index, arg := range os.Args[1:] {
    s += fmt.Sprintf("%d: %s", index, arg)
}
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://code>时,您的原始代码没有问题。您正在创建一个新切片,它与任何从索引0开始的切片一样。
这是风格(和性能)的问题,但你也可以这样做:

for index, arg := range os.Args {
    if index < 1 {
        continue
    }
    s += fmt.Sprintf("%d: %s", index, arg)
}
对于索引,arg:=范围os.Args{
如果索引<1{
持续
}
s+=fmt.Sprintf(“%d:%s”,索引,参数)
}

在您的
shift
示例中,除了for循环的通常增量之外,您每次向索引添加1。在只读取参数1、3、5等时,这难道不能解决问题吗?@MateiRadu不,索引是为每个循环重新分配的,因此代码可以工作。如果使用一个新变量,比如
originalIndex:=index+1
though@FranckJeannin感谢您的解释,它消除了我对
范围如何工作的疑虑。谢谢您的回答!