Akan lebih mudah untuk mengatakan sesuatu seperti:
for _, element := reverse range mySlice {
...
}
Jawaban:
Tidak ada operator yang nyaman untuk menambahkan ini ke jangkauan satu di tempat. Anda harus melakukan loop menghitung mundur normal:
s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}
Anda juga bisa melakukan:
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
}
Keluaran:
1
2
3
4
5
Juga di sini: http://play.golang.org/p/l7Z69TV7Vl
Variasi dengan indeks
for k := range s {
k = len(s) - 1 - k
// now k starts from the end
}
Bagaimana jika menggunakan penundaan:
s := []int{5, 4, 3, 2, 1}
for i, _ := range s {
defer fmt.Println(s[i])
}
defertetapi saya percaya menggunakan ini di dalam loop untuk mundur cukup rumit dan seharusnya cukup tidak efektif dalam hal memori.
deferdengan cara yang tidak dimaksudkan untuk itu. Jangan gunakan ini karena dapat memiliki efek samping yang buruk (keluar dari urutan eksekusi). Cukup gunakan forloop dalam jawaban yang diterima. Go bertujuan untuk meminimalkan peretasan pintar (bukan) semacam ini karena mereka cenderung menggigit Anda nanti.
Seseorang dapat menggunakan saluran untuk membalik daftar dalam suatu fungsi tanpa menduplikasinya. Itu membuat kode lebih bagus dalam pengertian saya.
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{}? Karena reversefungsi sekarang hanya mendukung string.
func reverse(lst []interface{}) chan inyterface{} tidak akan lagi menggunakan string [] sebagai masukan. Bahkan jika string bisa dicasting dalam antarmuka {}, string [] tidak bisa ditransmisikan dalam antarmuka [] {}. Sayangnya, fungsi kebalikan saat ini adalah jenis fungsi yang perlu banyak ditulis ulang.
Ketika saya perlu mengekstrak elemen dari rentang irisan dan terbalik, saya menggunakan sesuatu seperti kode ini:
// 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")
}
}
Keluaran:
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}
Taman bermain: https://play.golang.org/p/gx6fJIfb7fo