158 votes

Existe-t-il un moyen d'itérer sur une tranche en sens inverse en Go ?

Il serait pratique de pouvoir dire quelque chose comme :

for _, element := reverse range mySlice {
        ...
}

229voto

Ulf Holm Nielsen Points 1916

Non, il n'y a pas d'opérateur pratique pour cela, à ajouter à la gamme déjà en place. Vous devrez faire une boucle normale de comptage vers le bas :

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

62voto

zzzz Points 23017

Vous pouvez aussi le faire :

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
}

Sortie :

1
2
3
4
5

Également ici : http://play.golang.org/p/l7Z69TV7Vl

23voto

Nicky Feller Points 687

Variation avec l'indice

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

6voto

Matt Points 475

Et si on utilisait le différé ?

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

5voto

user983716 Points 1044

On pourrait utiliser un canal pour inverser une liste dans une fonction sans la dupliquer. Cela rend le code plus agréable à mon sens.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X