Changes in new versions / Go 1.23

// *** before: ***
func Backward(s []string) []string {
    r := make([]stringlen(s))
    for i, v := range s {
        r[len(s)-1-i] = v
    }
    return r
}

for _, v := range Backward([]string{"a""b""c"}) {
    fmt.Println(v)
}
// перед обходом всегда собирался промежуточный срез

// *** in version 1.23: ***
func Backward(s []string) iter.Seq[string] {
    return func(yield func(stringbool) {
        for i := len(s) - 1; i >= 0; i-- {
            if !yield(s[i]) {
                return
            }
        }
    }
}

for v := range Backward([]string{"a""b""c"}) {
    fmt.Println(v) // "c", "b", "a" без промежуточного среза
}