Подтвердить что ты не робот

Есть ли способ перебрать фрагмент в обратном направлении в Go?

Было бы удобно иметь возможность сказать что-то вроде:

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

Ответ 1

Нет, нет удобного оператора для этого, чтобы добавить в диапазон один на своем месте. Вам нужно будет сделать нормальный цикл для подсчета циклов:

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

Ответ 2

Вы также можете сделать:

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

Ответ 3

Можно использовать канал для изменения списка в функции без дублирования. Это делает код более приятным в моем смысле.

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

Как насчет использования отложить:

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

Ответ 5

Изменение с индексом

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