Ответ 1
Нет, нет удобного оператора для этого, чтобы добавить в диапазон один на своем месте. Вам нужно будет сделать нормальный цикл для подсчета циклов:
s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}
Было бы удобно иметь возможность сказать что-то вроде:
for _, element in reverse range mySlice {
...
}
Нет, нет удобного оператора для этого, чтобы добавить в диапазон один на своем месте. Вам нужно будет сделать нормальный цикл для подсчета циклов:
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
}