Sarebbe conveniente per essere in grado di dire qualcosa del tipo:C'è un modo per scorrere su una sezione al contrario in Go?
for _, element in reverse range mySlice {
...
}
Sarebbe conveniente per essere in grado di dire qualcosa del tipo:C'è un modo per scorrere su una sezione al contrario in Go?
for _, element in reverse range mySlice {
...
}
No non c'è conveniente dell'operatore per questo per aggiungere alla gamma uno sul posto. Dovrete fare un normale ciclo for il conto alla rovescia:
s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}
È anche possibile fare:
s := []int{5, 4, 3, 2, 1}
for i := range s {
fmt.Println(s[len(s)-1-i]) // Suggestion: do `last := len(s)-1` before the loop
}
uscita:
1
2
3
4
5
Anche qui: http://play.golang.org/p/l7Z69TV7Vl
Uno potrebbe usare un channe l per invertire una lista in una funzione senza duplicarla. Rende il codice più bello nel mio senso.
package main
import (
"fmt"
)
func reverse(lst []string) chan string {
ret := make(chan string)
go func() {
for i, _ := range lst {
ret <- lst[len(lst)-1-i]
}
close(ret)
}()
return ret
}
func main() {
elms := []string{"a", "b", "c", "d"}
for e := range reverse(elms) {
fmt.Println(e)
}
}
Mi sembra una soluzione pulita e piacevole da usare. È possibile generalizzare questo usando il tipo '[] interface {} '? Perché la presente funzione 'reverse' supporta solo le stringhe. – Atmocreations
Certo, basta sostituire la stringa tramite l'interfaccia {} e sei a posto. Voglio solo sottolineare che una funzione con signature 'func reverse (lst [] interface {}) chan inyterface {}' non prenderà più una stringa [] come input. Anche se la stringa può essere castata nell'interfaccia {}, [] la stringa non può essere castata nell'interfaccia [] {}. Sfortunatamente, la presente funzione inversa è il tipo di funzione che deve essere riscritta molto. – user983716
Grazie. Questa è la brutta parte di go I think - che è in qualche modo inevitabile. Grazie! – Atmocreations
ne dite di uso rinviare:
s := []int{5, 4, 3, 2, 1}
for i, _ := range s {
defer fmt.Println(s[i])
}
Stavo andando giù, ma ho controllato e ... Come diavolo funziona? Suppongo che non possa essere garantito che venga eseguito esattamente in questo ordine inverso. Ho fatto una domanda: http://stackoverflow.com/questions/37073538/go-why-defer-in-range-loop-is-called-in-a-reverse-order –
Ho appena votato per il fatto ha portato qualche nuova conoscenza su "differire", ma credo che l'uso di questo in un ciclo per il reverse sia piuttosto complicato e dovrebbe essere piuttosto inefficace dal punto di vista della memoria. –
"funziona", ma se il ciclo non è l'ultima cosa nella funzione, si potrebbero ottenere risultati imprevisti. [Esempio.] (Https://play.golang.org/p/PxzTU0s1zw) – Daniel
Variazione con indice
for k := range s {
k = len(s) - 1 - k
// now k starts from the end
}
Il [go efficace] (http://golang.org/doc/effective_go.html) Pagina un esempio, ma questo in realtà è un po 'più carino e dichiara meno variabili. –
IMO Go ha un disperato bisogno di un costrutto di intervallo discendente. Non averlo causa un bel po 'di lavoro extra, come possiamo vedere ... - – Vector
Non direi disperatamente, sarebbe bello. –