В Go наконец-то добавили итераторы 🚀



Я часто ругаю JS, что в нем понятие итератора появилось только в спецификации 2015 года, а нормальная поддержка операций над итераторами только сейчас завозится.



При этом Python, Java, C#, ...подставь нужный яп... уже 100 лет в обед, или даже с самого начала поддерживали эту концепцию.



В новых ЯП, таких как Rust или Julia это напрямую влияет на дизайн стандартной библиотеки.



А вот в JS их долго не было и это порядком испортило дизайн языка. Тут вам и куча разных циклов. И неочевидная семантика функций forEach/map и т.д.



Но хватит о JS. Тут вышел новый Go 1.23 , в который тоже завезли поддержку итераторов. Удивительно, но современный Go не имел такой поддержки. Более того, дженерики в нем появились даже раньше 🙈



- В циклах "for" при определении диапазонов значений появилась возможность указания функции в качестве аргумента выражения "range" для использования этой функции в качестве итератора, что позволяет создавать собственные итераторы для любых последовательностей. Возможно указание функций следующих типов: func(func() bool), func(func(K) bool) и func(func(K, V) bool).



- Добавлен новый пакет iter, предоставляющий базовые операции для организации перебора последовательностей. Кроме того, в пакеты slices и maps добавлены новые возможности для работы с итераторами. Например, для перебора ключей ассоциативного массива в отсортированном виде теперь можно указать for i, x := range slices.Sorted(maps.Keys(m)) {...}.



Подробнее про релиз.



Одним словом здорово, что добавили. Но, странно, что только сейчас.



Всем базы! 🚀