For loop 对…的`的迭代顺序。。。范围`当索引是隐式的

For loop 对…的`的迭代顺序。。。范围`当索引是隐式的,for-loop,go,slice,specifications,For Loop,Go,Slice,Specifications,对于带有range子句的语句 对于数组、指向数组的指针或切片值a,索引迭代值按递增顺序生成,从元素索引0开始。如果最多存在一个迭代变量,范围循环将生成从0到lena-1的迭代值,并且不会索引到数组或切片本身。对于nil切片,迭代次数为0 根据规范,遍历Go中的线性数据结构数组、切片或字符串将始终按索引增加的顺序获取其中的每个元素 for i, v := range []int{11, 22, 33, 44} { fmt.Println(i, v) } 但问题是我在说明书中找不到保证 这

对于带有range子句的语句

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

根据规范,遍历Go中的线性数据结构数组、切片或字符串将始终按索引增加的顺序获取其中的每个元素

for i, v := range []int{11, 22, 33, 44} {
    fmt.Println(i, v)
}
但问题是我在说明书中找不到保证

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

for _, v := range []int{11, 22, 33, 44} {
    fmt.Println(v)
}
我上面提到的两个例子是否总是按相同的顺序执行

我想他们会的,但我还没有听到承诺


你对……有什么看法。。。当索引迭代值由空白标识符表示下划线>

< p>时,范围工作,这是在规范中,但我认为你忽略了一些东西。有迭代值和迭代变量

对于每个条目,它将迭代值分配给相应的迭代变量(如果存在),然后执行块

您的报价是指迭代值:

对于数组、指向数组的指针或切片值a,索引迭代值按递增顺序生成,从元素索引0开始。如果最多存在一个迭代变量,范围循环将生成从0到lena-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