Antworten:
Nein, es gibt keinen geeigneten Operator, um den vorhandenen Bereich zu erweitern. Sie müssen einen normalen Countdown für die Schleife durchführen:
s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}
Sie können auch tun:
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
}
Ausgabe:
1
2
3
4
5
Auch hier: http://play.golang.org/p/l7Z69TV7Vl
Variation mit Index
for k := range s {
k = len(s) - 1 - k
// now k starts from the end
}
Wie wäre es mit Defer verwenden:
s := []int{5, 4, 3, 2, 1}
for i, _ := range s {
defer fmt.Println(s[i])
}
defer
aber ich glaube, dass es ziemlich schwierig ist, dies in einer Schleife für den Rückwärtsgang zu verwenden, und dass es in Bezug auf das Gedächtnis ziemlich ineffektiv sein sollte.
defer
auf eine Weise verwendet, für die es nicht vorgesehen ist. Verwenden Sie dies nicht, da es böse Nebenwirkungen haben kann (Ausführung außerhalb der Reihenfolge). Verwenden Sie einfach die for
Schleife in der akzeptierten Antwort. Go ist bestrebt, diese Art von cleveren (nicht) Hacks zu minimieren, da sie dazu neigen, dich später in den Arsch zu beißen.
Man könnte einen Kanal verwenden, um eine Liste in einer Funktion umzukehren, ohne sie zu duplizieren. Es macht den Code in meinem Sinne schöner.
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)
}
}
[]interface{}
? Weil die Present-Funktion reverse
nur Strings unterstützt.
func reverse(lst []interface{}) chan inyterface{}
keine [] Zeichenfolge mehr als Eingabe verwendet. Selbst wenn ein String in die Schnittstelle {} umgewandelt werden kann, kann der String [] nicht in die Schnittstelle [] {} umgewandelt werden. Leider ist die vorliegende Umkehrfunktion die Art von Funktion, die viel umgeschrieben werden muss.
Wenn ich Elemente aus einem Slice extrahieren und den Bereich umkehren muss, verwende ich so etwas wie diesen Code:
// reverse range
// Go Playground: https://play.golang.org/p/gx6fJIfb7fo
package main
import (
"fmt"
)
type Elem struct {
Id int64
Name string
}
type Elems []Elem
func main() {
mySlice := Elems{{Id: 0, Name: "Alice"}, {Id: 1, Name: "Bob"}, {Id: 2, Name: "Carol"}}
for i, element := range mySlice {
fmt.Printf("Normal range: [%v] %+v\n", i, element)
}
//mySlice = Elems{}
//mySlice = Elems{{Id: 0, Name: "Alice"}}
if last := len(mySlice) - 1; last >= 0 {
for i, element := last, mySlice[0]; i >= 0; i-- {
element = mySlice[i]
fmt.Printf("Reverse range: [%v] %+v\n", i, element)
}
} else {
fmt.Println("mySlice empty")
}
}
Ausgabe:
Normal range: [0] {Id:0 Name:Alice}
Normal range: [1] {Id:1 Name:Bob}
Normal range: [2] {Id:2 Name:Carol}
Reverse range: [2] {Id:2 Name:Carol}
Reverse range: [1] {Id:1 Name:Bob}
Reverse range: [0] {Id:0 Name:Alice}
Spielplatz: https://play.golang.org/p/gx6fJIfb7fo