Esiste un foreach
costrutto nella lingua Go? Posso iterare su una porzione o un array usando un for
?
range
in for
loop è anche menzionato nella sezione "Un interludio sui tipi" (verso la fine) del tutorial Go.
Esiste un foreach
costrutto nella lingua Go? Posso iterare su una porzione o un array usando un for
?
range
in for
loop è anche menzionato nella sezione "Un interludio sui tipi" (verso la fine) del tutorial Go.
Risposte:
https://golang.org/ref/spec#For_range
Un'istruzione "for" con una clausola "range" scorre tutte le voci di un array, slice, stringa o mappa o valori ricevuti su un canale. Per ogni voce assegna i valori di iterazione alle corrispondenti variabili di iterazione e quindi esegue il blocco.
Come esempio:
for index, element := range someSlice {
// index is the index where we are
// element is the element from someSlice for where we are
}
Se non ti interessa l'indice, puoi utilizzare _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
Il trattino basso, _
è l' identificatore vuoto , un segnaposto anonimo.
element
è il valore dell'elemento (una copia) - non è l'elemento stesso. Sebbene sia possibile assegnare a element
, ciò non influirà sulla sequenza sottostante.
_()
nello spazio dei nomi locale" che è solo per convenzione , non fa parte della libreria di localizzazione. Il carattere di sottolineatura _
è un'etichetta valida ed è anche una convenzione in Go (e Python, Scala e altre lingue) da assegnare _
per i valori di ritorno che non verranno utilizzati. L'ambito di _
questo esempio è limitato al corpo del for
loop. Se si dispone di una funzione con ambito pacchetto _
, verrebbe ombreggiata all'interno dell'ambito del ciclo for. Ci sono alcuni pacchetti per la localizzazione, non ho visto alcun uso _
come nome di una funzione.
Go ha una foreach
sintassi simile. Supporta matrici / sezioni, mappe e canali.
Scorrere su array o slice :
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
Scorrere su una mappa :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
Scorrere su un canale :
for v := range theChan {}
L'iterazione su un canale equivale alla ricezione da un canale fino alla sua chiusura:
for {
v, ok := <-theChan
if !ok {
break
}
}
chan
sull'uso: andare su un canale uscirà con garbo dal ciclo se lo scrittore chiude il canale ad un certo punto. Nella for {v := <-theChan}
equivalente , esso non esce sul canale vicino. È possibile verificare questo tramite il secondo ok
valore restituito. ESEMPIO TOUR
for { ... }
rappresenta un ciclo infinito.
L'esempio seguente mostra come utilizzare l' range
operatore in un for
ciclo per implementare un foreach
ciclo.
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;
}
L'esempio scorre una serie di funzioni per unificare la gestione degli errori per le funzioni. Un esempio completo è nel parco giochi di Google .
PS: mostra anche che le parentesi graffe sospese sono una cattiva idea per la leggibilità del codice. Suggerimento: la for
condizione termina poco prima della action()
chiamata. Ovvio, no?
,
ed è più chiaro dove for
finisce la condizione: play.golang.org/p/pcRg6WdxBd - Questa è in realtà la prima volta che trovo un argomento contrario allo go fmt
stile, grazie!
Puoi infatti usare range
senza fare riferimento ai suoi valori di ritorno usando for range
contro il tuo tipo:
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++
}
Di seguito è riportato il codice di esempio su come utilizzare foreach in golang
package main
import (
"fmt"
)
func main() {
arrayOne := [3]string{"Apple", "Mango", "Banana"}
for index,element := range arrayOne{
fmt.Println(index)
fmt.Println(element)
}
}
Questo è un esempio corrente https://play.golang.org/p/LXptmH4X_0
Sì, intervallo :
La forma di intervallo del ciclo for scorre su una sezione o una mappa.
Quando si estende su una sezione, vengono restituiti due valori per ogni iterazione. Il primo è l'indice e il secondo è una copia dell'elemento in quell'indice.
Esempio :
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)
}
}
Questo può essere ovvio, ma puoi incorporare l'array in questo modo:
package main
import (
"fmt"
)
func main() {
for _, element := range [3]string{"a", "b", "c"} {
fmt.Print(element)
}
}
uscite:
abc