Перейти к содержимому
14 / 15

Итераторы range-over-func: зачем понадобились и как написать свой

До Go 1.23 обойти пользовательскую коллекцию в range было нельзя: цикл работал только со слайсами, картами, строками, каналами и числами. Приходилось либо отдавать наружу слайс целиком (дорого для больших и невозможно для бесконечных последовательностей), либо писать курсор с методами Next и Value, либо принимать колбэк. Range-over-func снял это: range научился принимать функцию определённой формы, и пакет iter закрепил две сигнатуры — Seq[V] для одного значения и Seq2[K, V] для пары. Итератор — это функция, принимающая yield: она вызывает yield для каждого элемента и обязана прекратить работу, если yield вернул false, иначе break и return из цикла сломаются. Практическая ценность в ленивости: можно обходить страницы API, строки файла или бесконечную последовательность, не материализуя её. В стандартной библиотеке на этом построены maps.Keys, slices.Values и strings.SplitSeq.

Итераторы range-over-func: зачем понадобились и как написать свой | JScriptiser