【发布时间】:2019-06-27 23:36:36
【问题描述】:
https://golang.org/ref/spec#For_range
对于带有 range 子句的语句
对于数组、指向数组的指针或切片值 a,索引迭代值按递增顺序生成,从元素索引 0 开始。如果最多存在一个迭代变量,则范围循环从 0 开始生成迭代值到 len(a)-1 并且不索引到数组或切片本身。对于 nil 切片,迭代次数为 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如何工作?
【问题讨论】:
-
完全一样。唯一的区别是您没有将索引分配给变量。
-
有什么证据吗?我知道他们是一样的。如果我写了后者,而就在有一天程序突然开始以随机顺序检索元素,就好像切片是一张地图一样,会发生什么?我想确定没有索引的
for ... range是否真的可靠。 -
证明在规范中。如果它做除此之外的任何事情,它就坏了。 blank identifier 只是一个标识符。根据定义,它不能产生任何其他影响。
标签: for-loop go slice specifications