2012-11-02 12 views

risposta

73

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]) 
} 
+0

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. –

+3

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

+12

Non direi disperatamente, sarebbe bello. –

28

È 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

4

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) 
    } 
} 
+0

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

+0

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

+0

Grazie. Questa è la brutta parte di go I think - che è in qualche modo inevitabile. Grazie! – Atmocreations

2

ne dite di uso rinviare:

s := []int{5, 4, 3, 2, 1} 
for i, _ := range s { 
    defer fmt.Println(s[i]) 
} 
+0

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 –

+3

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. –

+2

"funziona", ma se il ciclo non è l'ultima cosa nella funzione, si potrebbero ottenere risultati imprevisti. [Esempio.] (Https://play.golang.org/p/PxzTU0s1zw) – Daniel

2

Variazione con indice

for k := range s { 
     k = len(s) - 1 - k 
     // now k starts from the end 
    } 
Problemi correlati