7 ответов:
http://golang.org/doc/go_spec.html#For_statements
оператор "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 }подчеркивание,
_, это пустой идентификатор анонимный заполнитель.
перебрать массив или slice:
// index and value for i, v := range slice {} // index only for i := range slice {} // value only for _, v := range slice {}перебора карта:
// key and value for key, value := range theMap {} // key only for key := range theMap {} // value only for _, value := range theMap {}перебора канал:
for v := range theChan {}итерация по каналу эквивалентна приему от канала до его закрытия:
for { v, ok := <-theChan if !ok { break } }
в следующем примере показано, как использовать
rangeоператораforцикл для реализацииforeachпетли.func PrintXml (out io.Writer, value interface{}) error { var data []byte var err error for _, action := range []func() { func () { data, err = xml.MarshalIndent(value, "", " ") }, func () { _, err = out.Write([]byte(xml.Header)) }, func () { _, err = out.Write(data) }, func () { _, err = out.Write([]byte("\n")) }} { action(); if err != nil { return err } } return nil; }в Примере выполняется итерация по массиву функций для унификации обработки ошибок для функций. Полный пример находится в Googles детская площадка.
PS: Это также показывает, что висячие скобки-плохая идея для удобочитаемости кода. Подсказка:
forусловие заканчивается непосредственно передaction()звонок. Очевидно, не так ли?
вы можете на самом деле использовать
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++ }
Ниже приведен пример кода для использования foreach в golang
package main import ( "fmt" ) func main() { arrayOne := [3]string{"Apple", "Mango", "Banana"} for index,element := range arrayOne{ fmt.Println(index) fmt.Println(element) } }это запущенный пример https://play.golang.org/p/LXptmH4X_0
Это может быть очевидно, но вы можете встроить массив следующим образом:
package main import ( "fmt" ) func main() { for _, element := range [3]string{"a", "b", "c"} { fmt.Print(element) } }выходы:
abc
да ряд:
форма диапазона цикла 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) } }
- вы можете пропустить индекс или значение, присвоив _.
- Если вам нужен только индекс, полностью отбросьте значение.
Comments