iter
пакет
13 августа вышел Go 1.23.0. Коротко о самом важном изменении в языке и SDK.
Улучшена скорость сборки проекта с PGO, а также улучшено КПД от PGO.
Несмотря на то, что в новой версии Go появилось сразу 3 новых пакета в SDK (iter, structs, unique),
нас интересует iter
, т.к. остальные два имеют редкую область применения.
Напомню, что в версии Go 1.22.0 также расширился функционал range-клаузы в цикле for: начиная с этой версии
можно получить ряд чисел. Так, range 10
вернет значения от 0 до 9 включительно. В Go 1.23.0
добавились итераторы. Proposal был предложен в июле 2023 года и вот, спустя чуть более чем год
мы получили обновления в языке. Определение итератора в Go:
An iterator is a function that passes successive elements of a sequence to a callback function
Теперь можно итерировать по функциям, которые принимают в качестве аргументов 0, 1 или 2 generic значения. Для чего это нужно? Если вы создаете некий тип или функцию, по результатам которой чаще всего будут выполнять итерации, то теперь можно использовать range по функции. Например, вот так теперь может выглядеть хелпер-функция для обратной итерации по слайсу:
// Backward returns an iterator over index-value pairs in the slice, // traversing it backward with descending indices. func Backward[Slice ~[]E, E any](s Slice) iter.Seq2[int, E] { return func(yield func(int, E) bool) { for i := len(s) - 1; i >= 0; i-- { if !yield(i, s[i]) { return } } } }
А её использование будет выглядеть так:
s := []string{"hello", "world"} for i, x := range slices.Backward(s) { fmt.Println(i, x) }
Т.е. код, использующий итераторы будет более читаемым. Теперь, для того чтобы получить ключи map и отсортировать их, достаточно написать это:
slices.Sorted(maps.Keys(m))
Для удобства написания таких функций в пакете iter
добавлено два новых типа: Seq[V any]
и Seq2[K, V any]
.
Итого, если вы видите в пакете файл iter.go
, значит в этом пакете есть хелпер generic функции для
удобных итераций. Если создаете свой тип и по нему часто будут выполнять итерации, то рассмотрите вариант
реализации идеоматичных итераторов. При этом обратите внимание на предложенный в SDK нейминг для таких функций.
Чаще всего проекты с открытым кодом воспринимают как хобби ("код во имя кода"). Некоторые проекты намеренно отказываются даже от donation чтобы как можно меньше чувствовать обязанность перед донорами.
Что дает проект с открытым исходным кодом? По исследованию Facebook и Walmart, половина из опрошенных соискателей на позицию разработчика знали про OSS проекты этих компаний и это привлекло их интерес к этим компаниям. Компании, делающие вклад в поддержку OSS проектов гордятся этим. Выше кредит доверия со стороны потенциальных покупателей продукты, т.к. качество закрытого продукта сложно оценить.
Какие риски видят для себя компании, использующие OSS? Это, во-первых, неконтролируемые обновления. Во-вторых, поддержку проекта могут забросить и не вносить security обновления. Предположим, что ты зависишь от какой-то библиотеки и в ней обнаружили уязвимость. Хорошо, если ты мониторишь свои кодовые зависимости на уязвимости, но часто это не так. Разработчики теряют интерес к проектам и ты остаешься с устаревающей дырявой зависимостью. Открытая природа OSS проектов. Такие проекты легко изучать на уязвимости. Внедрение вредоносного софта. Вы не знаете разработчиков каждой библиотеки, от которой зависите, поэтому есть вероятность затащить себе в проект бэкдор. Так, в прошлом году github опубликовал интересный способ атаки северокорейских взломщиков (не называю их хакерами). Взломщики клонировали профиль влиятельного разарботчика в github или другой соц. сети, под прикрытием фейкового аккаунта контактировали с разработчиками в тех. компаниях и предлагали поучаствовать в Open Source проекте. Жертва скачивала зависимости (npm) и затаскивала себе вредоносный софт. Неоднородное качество кода, т.к. к работе привлекаются волонтеры разного уровня и в OSS проектах часто нехватает код-ревью.
Полезные советы можно почерпнуть на reddit в фиде opensource. David, maintainer AnkiDroid, делится следующим (напомню, речь про коммерческий проект): начинать лучше с закрытого кода и задуматься о его публикации, если:
Какие проекты хороши для того чтобы опубликовать их исходный код? Библиотеки, building blocks кодовых проектов. Open core, ядро открытое, но весь обвес доступен только в платной версии (например, gitlab, MongoDB).