Порядок итераций `for ... range` в Голанге, когда индекс неявный - PullRequest
0 голосов
/ 04 февраля 2019

https://golang.org/ref/spec#For_range

Для операторов с диапазон предложение

Для массива, указателя на массив или значения слайса a значения итерации индексапроизводится в порядке возрастания, начиная с индекса элемента 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, когда значение итерации индекса представлено пустым идентификатором (подчеркивание _)?

1 Ответ

0 голосов
/ 04 февраля 2019

Это в спецификации, но я думаю, что вы что-то упускаете.Есть значения итерации и переменные итерации .

Для каждой записи она присваивает значения итерации соответствующим переменным итерации если присутствует и затем выполняет блок.

И ваша цитата относится к значениям итерации :

Для массива указатель на массив,или значение среза 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
...