Что выведет код Senior Дженерики обновлено

Что выведет Go: итератор iter.Seq и break

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import (
    "fmt"
    "iter"
)

func Count(n int) iter.Seq[int] {
    return func(yield func(int) bool) {
        for i := range n {
            if !yield(i) {
                fmt.Println("stop at", i)
                return
            }
        }
        fmt.Println("done")
    }
}

func main() {
    for v := range Count(5) {
        if v == 2 {
            break
        }
        fmt.Println(v)
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 0, 1, stop at 2. С Go 1.23 range умеет ходить по функциям-итераторам.

Что выведет

0
1
stop at 2

Разбор

С Go 1.23 range умеет ходить по функциям-итераторам. Тело цикла превращается в функцию yield. На v = 2 срабатывает break, yield возвращает false, итератор видит это, печатает stop at 2 и выходит. До done дело не доходит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.