隐含索引时,Golang中“ for ... range”的迭代顺序

时间:2019-02-04 08:41:08

标签: for-loop go slice specifications

https://golang.org/ref/spec#For_range

  

对于带有 range 子句

的语句      

对于数组,指向数组的指针或切片值a,从元素索引0开始以递增顺序生成索引迭代值。如果存在最多一个迭代变量,则范围循环从0向上生成迭代值到len(a)-1,并且不会索引到数组或切片本身。对于零切片,迭代次数为0。

根据规范,对Go中的线性数据结构(数组,切片或字符串)进行迭代将始终在其中按索引顺序增加每个元素。

for i, v := range []int{11, 22, 33, 44} {
    fmt.Println(i, v)
}

但是问题是我在规范中无法真正找到保证,

这个带有隐式索引迭代值的range-iterate-over子句也将始终保持相同的顺序:

for _, v := range []int{11, 22, 33, 44} {
    fmt.Println(v)
}

我上面提到的两个示例是否总是以相同的顺序执行?

我认为他们会这样做,但是我还没有听到诺言。

当索引迭代值由空白标识符(下划线for ... range)表示时,_如何工作?

1 个答案:

答案 0 :(得分:8)

已在规格中,但我认为您忽略了某些内容。有 iteration值 iteration变量

  

对于每个条目,它会为相应的 iteration变量(如果存在)分配 iteration值,然后执行该块。

您的报价是指迭代值

  

对于数组,指向数组的指针或切片值a,从元素索引0开始以递增顺序生成索引迭代值。如果最多有一个迭代变量是目前,范围循环会产生从0到len(a)-1的迭代值,并且不会索引到数组或切片本身。

如您所见,无论有多少个迭代变量,迭代值始终从元素索引0开始按升序排列。

第二个迭代值始终为a[i],其中i对应于第一个迭代值,索引为:

Range expression                          1st value          2nd value

array or slice  a  [n]E, *[n]E, or []E    index    i  int    a[i]       E