https://golang.org/ref/spec#For_range
对于范围条款声明
用于阵列,指针阵列,或切片值,迭代值以递增顺序,开始于元素索引产生的索引0。如果至多一个迭代变量存在时,范围从0循环产生迭代值高达LEN( A)-1并且不索引到阵列或切片本身。对于零切片,迭代的次数为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)
}
将那些两个例子我上面放总是以相同的顺序执行?
我认为他们这样做,但我还没有听说过的诺言呢。
如何当指数迭代值由空白标识符(下划线for ... range
)表示_
工作?
这是在规范,但我想你忽略的东西。有迭代值和迭代变量。
对于每个条目它迭代值分配给相应的迭代的变量(如果存在),然后执行块。
和你的报价是指迭代值:
用于阵列,指针阵列,或切片值
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