Своя последовательность в Go
Свою последовательность пишут функцией,
которая возвращает функцию шага. Внешняя
часть может принимать параметры, например
стартовое число, а внутренняя в цикле зовет
yield с очередным значением.
Так удобно описывать обратный счет, диапазон с шагом или любой порядок, который не хранят отдельным срезом. Итератор сам решает, когда закончить, проверяя ответ шага после каждого значения.
На экране строки 4, 3, 2
и 1. Внутренний цикл уменьшает
i и после каждого шага смотрит,
вернул ли yield истину.
Сделаем обратный счет от заданного числа
до 1:
package main
import "fmt"
func CountDown(n int) func(func(int) bool) {
return func(yield func(int) bool) {
for i := n; i > 0; i-- {
if !yield(i) {
return
}
}
}
}
func main() {
for v := range CountDown(4) {
fmt.Println(v)
}
}
Дано число:
start := 3
Напишите итератор обратного счета от
start до 1 и выведите все
значения через цикл перебора.
Дан следующий код:
func Twice(n int) func(func(int) bool) {
return func(yield func(int) bool) {
yield(n)
yield(n)
}
}
Скажите, сколько раз шаг получит одно и то же число при переборе этой последовательности.
Дано число:
limit := 5
Опишите итератор, который отдает целые
от 1 до limit включительно,
и выведите их.