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

aga*_*gam 78 go

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

for _, element in reverse range mySlice {
        ...
}
Run Code Online (Sandbox Code Playgroud)

Ulf*_*sen 111

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

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

  • 我不会拼命地说,这将是一个很好的. (17认同)
  • 语言的缺点迫使您使用索引来访问数组的元素,对于超级常见的用例,当解决方案很容易实现时,迫切需要该解决方案。 (7认同)
  • 我无法说出哪个更糟糕,Go 不知道如何向后迭代数组,或者人们认为这很好。该语言大约完成了 30%。 (4认同)
  • IMO Go迫切需要一个降序范围构造.没有它会导致大量的额外工作,我们可以看到.... - (3认同)

zzz*_*zzz 35

你也可以这样做:

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
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

也在这里:http://play.golang.org/p/l7Z69TV7Vl


Nic*_*ler 8

指数变化

for k := range s {
        k = len(s) - 1 - k
        // now k starts from the end
    }
Run Code Online (Sandbox Code Playgroud)


use*_*716 5

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

如何使用延期:

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

  • 我投票只是因为它带来了一些关于`defer`的新知识,但我相信在一个循环中使用它来进行反向是非常棘手的,并且在内存方面应该是非常无效的. (6认同)
  • 它"工作",但如果循环不是函数中的最后一件事,你可能会得到意想不到的结果.[实施例](https://play.golang.org/p/PxzTU0s1zw) (6认同)
  • 这是以一种不适合的方式使用`defer`.不要使用它,因为它可能有令人讨厌的副作用(乱序执行).只需在接受的答案中使用`for`循环.Go旨在最大限度地减少这种*聪明的*(非)黑客攻击,因为它们往往会在屁股中咬你. (3认同)
  • 这是推迟使用的恶意手段,应避免使用。例如,如果这是某人将来可能扩展的功能,则可能会产生意想不到的后果。 (2认同)
  • 这还不够“难”,所以我继续并*添加了*频道https://play.golang.org/p/GodEiv1LlIJ (2认同)

Iva*_*ras 5

到 2022 年,您可以使用泛型就地反转任何切片:

func reverse[S ~[]E, E any](s S) {
    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
        s[i], s[j] = s[j], s[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想使用 Go 1.21(2023 年 8 月发布)反转切片,您可以使用 slices.Reverse (您需要导入切片)来反转切片的元素。因此,为了以相反的顺序迭代,您首先需要 slice.Reverse(mySlice),然后使用常规的 For 或 For-each 范围。 (2认同)