的迭代顺序为`...在Golang range`当索引是隐式

问题描述 投票:0回答:1

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)表示_工作?

for-loop go slice specifications
1个回答
8
投票

这是在规范,但我想你忽略的东西。有迭代值和迭代变量。

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

和你的报价是指迭代值:

用于阵列,指针阵列,或切片值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
© www.soinside.com 2019 - 2024. All rights reserved.