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
)表示时,_
如何工作?
答案 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