Esiste un costrutto foreach
nella lingua Go? Posso scorrere su una slice o array usando un for
?C'è un ciclo foreach in Go?
risposta
http://golang.org/doc/go_spec.html#For_statements
A "a" economico con un "range" itera clausola di tutte le voci di un array, slice, stringa o carta, o valori ricevuti su un canale. Per ciascuna voce assegna i valori di iterazione alle corrispondenti variabili di iterazione e quindi esegue il blocco.
Per fare un 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 si preoccupano l'indice, è possibile utilizzare _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
La sottolineatura, _
, è il blank identifier, un anonimo segnaposto.
Probabilmente è utile dire che _ è chiamato un identificatore vuoto e ignora semplicemente il valore di ritorno –
L'esempio seguente mostra come utilizzare l'operatore range
in un ciclo for
per implementare un ciclo 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;
}
L'esempio iterazioni su una serie di funzioni di unificare la gestione delle funzioni di errore. Un esempio completo è su Google's playground.
PS: mostra anche che le parentesi graffe sono una cattiva idea per la leggibilità del codice. Suggerimento: la condizione for
termina poco prima della chiamata action()
. Ovvio, non è vero?
Aggiungi un ',' ed è più chiaro dove finisce la condizione 'for': http://play.golang.org/p/ pcRg6WdxBd - Questa è davvero la prima volta che ho trovato un contro-argomento per lo stile 'go fmt', grazie! – topskip
@topskip entrambi sono validi fmt; scegli quello migliore :) –
@FilipHaglund Non è il punto se è valido. Il punto è che IMO è più chiaro dove finisce la condizione for in quel caso particolare sopra. – topskip
iterare matrice o fetta:
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
iterazioni su una cartina :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
iterazioni su un canale :
for v := range theChan {}
Equivalente a:
for {
v := <-theChan
}
Sebbene l'OP abbia chiesto solo l'utilizzo delle fette, preferisco questa risposta, perché la maggior parte alla fine necessiterà anche degli altri usi. – domoarrigato
importante distinzione sull'uso di 'chan': l'estensione su un canale uscirà con grazia dal ciclo se lo scrittore chiude il canale ad un certo punto. Nel 'for {v: = <-theChan}' _equivalent_, non * uscirà sulla chiusura del canale. Puoi testare questo tramite il secondo valore di ritorno 'ok'. [TOUR EXAMPLE] (https://tour.golang.org/concurrency/4) – colminator
Pensato lo stesso durante la lettura, 'for {...}' indica un ciclo infinito. – Levit
È possibile, infatti, utilizzare range
senza fare riferimento Si tratta di valori di ritorno utilizzando 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++
}
Buono a sapersi, ma non sarà utile nella maggior parte dei casi – Sridhar
Concordato @Sridhar è una nicchia carina. – robstarbuck
seguito è riportato il codice di esempio per 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 in esecuzione https://play.golang.org/p/LXptmH4X_0
- 1. Infinite IEnumerable in un ciclo foreach
- 2. Riavvia un ciclo foreach in C#?
- 3. Errore ciclo Foreach
- 4. Modifica di un ciclo foreach su un ciclo Parallel.ForEach
- 5. ciclo foreach con contatore
- 6. DeleteObject() nel ciclo foreach
- 7. PHP Ciclo Foreach efficienza
- 8. Ciclo foreach molto lento
- 9. Riempi un array utilizzando un ciclo foreach
- 10. Ciclo foreach SQL
- 11. Posso tirare l'elemento successivo all'interno di un ciclo Foreach foreach?
- 12. Utilizzo del ciclo foreach in JSF
- 13. ciclo foreach vs ciclo while risultati
- 14. Come saltare un'iterazione di un ciclo `foreach`?
- 15. CoffeeScript: uscire da un ciclo foreach
- 16. Aggiornamento Struct in foreach ciclo in C#
- 17. C'è un modo per interrompere un ciclo foreach in velocità?
- 18. Avvio di un nuovo thread in un ciclo foreach
- 19. Come si rimuove un elemento dell'array in un ciclo foreach?
- 20. Sostituire ciclo foreach con LINQ
- 21. C# string.replace nel ciclo foreach
- 22. Refactor foreach al ciclo for
- 23. Fusione diretta nel ciclo foreach
- 24. Utilizzo collezioni nel ciclo foreach
- 25. Javascript foreach performance del ciclo
- 26. PHP ciclo foreach esempio confusione
- 27. ciclo foreach parallelo - comportamento anomalo
- 28. perl ciclo foreach nella subroutine
- 29. ciclo foreach con stringhe in Matlab
- 30. Ciclo Foreach in java per Dizionario
check-out: http://groups.google.com/group/golang-nuts/browse_thread/thread/e2966ccdfe910e14? pli = 1 – Kakashi
L'uso di 'range' in' for' loops è citato anche nella sezione "Un interludio sui tipi" (verso la sua fine) del tutorial Go . – kostix