Оператор «for» с предложением «range» выполняет итерацию всех записей массива, среза, строки или карты или значений, полученных на канале. Для каждой записи он присваивает значения итерации соответствующим переменным итерации и затем выполняет блок.
Например:
for index, element := range someSlice {// index is the index where we are// element is the element from someSlice for where we are}
Если вас не волнует индекс, вы можете использовать _:
for _, element := range someSlice {// element is the element from someSlice for where we are}
В этом примере elementэто значение элемента (копия) - это не сам элемент. Хотя вы можете назначить element, это не повлияет на основную последовательность.
Нобар
Я знаю, что в Python и C часто используется подчеркивание как функция для локализации (т. Е. Gettext ). Может ли использование подчеркивания вызвать проблемы в Go? Go даже использует одну и ту же библиотеку для локализации?
Сергей Колодяжный
3
@SergiyKolodyazhnyy Py docs говорит, что «(gettext) функция обычно псевдоним, как _()в локальном пространстве имен», что по соглашению , она не является частью lib локализации. Подчеркивание _является допустимой меткой, а также в Go (и в Python, и в Scala, и в других языках) принято присваивать _значения, которые вы не будете использовать. Область действия _в этом примере ограничена телом forцикла. Если у вас есть функция, находящаяся в пакете, _то она будет скрыта в пределах цикла for. Есть несколько пакетов для локализации, я не видел никакого использования _в качестве имени функции.
Давос,
150
Go имеет foreachпохожий синтаксис. Он поддерживает массивы / фрагменты, карты и каналы.
Итерация по массиву или срезу :
// index and valuefor i, v := range slice {}// index onlyfor i := range slice {}// value onlyfor _, v := range slice {}
Итерация по карте :
// key and valuefor key,value:= range theMap {}// key onlyfor key := range theMap {}// value onlyfor _,value:= range theMap {}
Итерация по каналу :
for v := range theChan {}
Итерация по каналу эквивалентна получению от канала до его закрытия:
Хотя ОП запрашивал только использование среза, я предпочитаю этот ответ, потому что большинству в конечном итоге понадобятся и другие варианты использования.
Домоаригато
3
важное различие в chanиспользовании: ранжирование по каналу изящно выйдет из цикла, если писатель в какой-то момент закроет канал. В for {v := <-theChan}эквиваленте , он не выйдет при закрытии канала. Вы можете проверить это через второе okвозвращаемое значение. ПРИМЕР
ТУРА
То же самое при чтении, for { ... }означает бесконечный цикл.
Левит
13
В следующем примере показано, как использовать rangeоператор в forцикле для реализации foreachцикла.
Пример перебирает массив функций для унификации обработки ошибок для функций. Полный пример на игровой площадке Google .
PS: это также показывает, что подвесные скобки - плохая идея для читабельности кода. Подсказка: forусловие заканчивается непосредственно перед action()вызовом. Очевидно, не так ли?
Добавьте a, ,и станет понятнее, где forзаканчивается условие: play.golang.org/p/pcRg6WdxBd. Это фактически первый раз, когда я нашел встречный аргумент go fmtстиля, спасибо!
topskip
@topskip оба действительны; просто выберите лучший :)
Филипп Хаглунд
@FilipHaglund Не имеет значения, если это действительно. Дело в том, что IMO более понятно, где условие for заканчивается в данном конкретном случае выше.
topskip
9
На мой взгляд, этот ответ неоправданно сложен для целевого вопроса.
AndreasHassing
@AndreasHassing Как это сделать вместо того, чтобы вводить избыточность?
выступление
10
Фактически вы можете использовать, rangeне ссылаясь на возвращаемые значения, используя for rangeтип:
arr := make([]uint8, 5)
i,j := 0,0
for range arr {
fmt.Println("Array Loop",i)
i++
}
for range "bytes" {
fmt.Println("String Loop",j)
j++
}
Иногда это самый простой пример, который является наиболее полезным. Спасибо! У меня нет ничего против самых эзотерических ответов других комментаторов - они, безусловно, иллюстрируют тонкости очень идиоматического программирования на Go, до такой степени, что они становятся ... нечитаемыми и трудными для понимания - но я предпочитаю ваш ответ: он идет прямо до сути с простейшим возможным примером (который работает, и очевидно, почему он работает).
Гвинет Ллевелин
4
Да, диапазон :
Форма диапазона цикла for выполняет итерации по фрагменту или карте.
При определении диапазона по срезу для каждой итерации возвращаются два значения. Первый - это индекс, а второй - копия элемента с этим индексом.
Пример :
package main
import"fmt"var pow =[]int{1,2,4,8,16,32,64,128}
func main(){for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)}for i := range pow {
pow[i]=1<<uint(i)// == 2**i}for _,value:= range pow {
fmt.Printf("%d\n",value)}}
Вы можете пропустить индекс или значение, присвоив _.
Если вам нужен только индекс, полностью удалите значение.
range
infor
также упоминается в разделе «Интерлюдия о типах» (ближе к его концу) руководства Go.Ответы:
https://golang.org/ref/spec#For_range
Например:
Если вас не волнует индекс, вы можете использовать
_
:Подчеркивание,
_
это пустой идентификатор , анонимный заполнитель.источник
element
это значение элемента (копия) - это не сам элемент. Хотя вы можете назначитьelement
, это не повлияет на основную последовательность._()
в локальном пространстве имен», что по соглашению , она не является частью lib локализации. Подчеркивание_
является допустимой меткой, а также в Go (и в Python, и в Scala, и в других языках) принято присваивать_
значения, которые вы не будете использовать. Область действия_
в этом примере ограничена теломfor
цикла. Если у вас есть функция, находящаяся в пакете,_
то она будет скрыта в пределах цикла for. Есть несколько пакетов для локализации, я не видел никакого использования_
в качестве имени функции.Go имеет
foreach
похожий синтаксис. Он поддерживает массивы / фрагменты, карты и каналы.Итерация по массиву или срезу :
Итерация по карте :
Итерация по каналу :
Итерация по каналу эквивалентна получению от канала до его закрытия:
источник
chan
использовании: ранжирование по каналу изящно выйдет из цикла, если писатель в какой-то момент закроет канал. Вfor {v := <-theChan}
эквиваленте , он не выйдет при закрытии канала. Вы можете проверить это через второеok
возвращаемое значение. ПРИМЕРfor { ... }
означает бесконечный цикл.В следующем примере показано, как использовать
range
оператор вfor
цикле для реализацииforeach
цикла.Пример перебирает массив функций для унификации обработки ошибок для функций. Полный пример на игровой площадке Google .
PS: это также показывает, что подвесные скобки - плохая идея для читабельности кода. Подсказка:
for
условие заканчивается непосредственно передaction()
вызовом. Очевидно, не так ли?источник
,
и станет понятнее, гдеfor
заканчивается условие: play.golang.org/p/pcRg6WdxBd. Это фактически первый раз, когда я нашел встречный аргументgo fmt
стиля, спасибо!Фактически вы можете использовать,
range
не ссылаясь на возвращаемые значения, используяfor range
тип:https://play.golang.org/p/XHrHLbJMEd
источник
Ниже приведен пример кода для использования foreach в golang
Это работающий пример https://play.golang.org/p/LXptmH4X_0
источник
Да, диапазон :
Форма диапазона цикла for выполняет итерации по фрагменту или карте.
При определении диапазона по срезу для каждой итерации возвращаются два значения. Первый - это индекс, а второй - копия элемента с этим индексом.
Пример :
источник
Это может быть очевидно, но вы можете встроить массив следующим образом:
выходы:
https://play.golang.org/p/gkKgF3y5nmt
источник