有没有办法在 Go 中反向迭代一个切片?

如果能够说这样的话会很方便:

for _, element := reverse range mySlice {
...
}
86217 次浏览

不,没有方便的操作符可以将其添加到适当的范围内。你必须做一个正常的 for循环倒计时:

s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}

你也可以这样做:

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
}

产出:

1
2
3
4
5

还有这里: http://play.golang.org/p/l7Z69TV7Vl

可以使用通道来反转函数中的列表,而无需复制它。在我看来,这让代码变得更好了。

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

延期使用怎么样:

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

指数变化

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

当我需要从一个切片中提取元素并进行反向范围时,我使用类似于下面这样的代码:

// 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")
}
}

产出:

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}

操场: https://play.golang.org/p/gx6fJIfb7fo

你可以使用 Go-Funk中的 funk.ForEachRight方法:

results := []int{}


funk.ForEachRight([]int{1, 2, 3, 4}, func(x int) {
results = append(results, x)
})


fmt.Println(results) // []int{4, 3, 2, 1}