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

时间:2012-11-02 07:07:43

标签: go

能够说出类似的内容会很方便:

for _, element in reverse range mySlice {
        ...
}

8 个答案:

答案 0 :(得分:99)

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

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

答案 1 :(得分:31)

你也可以这样做:

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

答案 2 :(得分:7)

如何使用defer:

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

答案 3 :(得分:4)

可以使用通道来反转函数中的列表而不重复它。它使代码在我看来更好。

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

答案 4 :(得分:4)

带索引的变体

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

答案 5 :(得分:2)

我想这是反转数组的最简单方法。

package main

import "fmt"

// how can we reverse write the array
func main() {

    arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    revArr := [len(arr)]int{} // making empty array for write reverse

    for i := range arr {
        revArr[len(arr)-1-i] = arr[i]
    }

    fmt.Println(revArr)
}

https://play.golang.org/p/QQhj26-FhtF

答案 6 :(得分:0)

reverse range 的优雅方法:

如果您的切片是瞬态的:在元素数大于零时循环,使用最后一个元素,然后将其删除。处理完第一个元素后切片将为空:

s := []int{1, 2, 3, 4}
for len(s) > 0 {
    item := s[len(s)-1]
    fmt.Printf("Reverse item: %+v\n", item)
    s = s[:len(s)-1]
}

输出

Reverse item: 4
Reverse item: 3
Reverse item: 2
Reverse item: 1

去游乐场https://play.golang.org/p/XKB43k7M9j3

答案 7 :(得分:0)

您可以使用 funk.ForEachRight 中的 go-funk 方法:

results := []int{}

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

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