proposal: math/rand/v2 — первый v2 пакет в стандартной библиотеке
Расс Кокс предлагает добавить в std новый пакет, который должен стать заменой существующему math/rand
.
Его ключевые особенности:
— Уберут метод Rand.Read
и функцию Read
. Аргументируют тем, что использование псевдослучайных чисел для генерации последовательностей из байт это почти всегда плохая идея. Более того, очень часто IDE подхватывает math/rand.Read
когда должен подхватить crypto/rand.Read
.
— Уберут Source.Seed
, Rand.Seed
, и функцию Seed
. Глобальный Seed
и так deprecated начиная с Go 1.20, а Source.Seed
, Rand.Seed
подразумевают, что зерно всегда имеет тип int64
, что не всех случаях так. Плюс отсутствие функции Seed
приведет к тому, что общий генератор случайных чисел будет всегда проинициализирован самим Go. Это позволит безболезненно менять алгоритм генерации случайных чисел глобальными функциями, не ломая обратную совместимость.
— У Source
интерфейса изменят сигнатуру метода с Int63() int64
на Uint64() uint64
. По этой же причине уберут интерфейс Source64
.
— Будут проведены различные оптимизации существующих методов.
— Добавят дженерик функцию аля rand.N[V Number](v V)
которая позволит легче работать с своими типами. Как пример: rand.N(1*time.Minute)
где возвращаемое не нужно будет приводить к time.Duration
.
— Новая реализация Source
— PCG-DXSM, генератор который и быстрее и занимает меньше памяти. Судя по предварительному API состояние генератора можно будет сохранять и восстанавливать из слайса байт.
Главная мотивация, кроме улучшения самого генератора, это показать как именно v2 пакеты должны в будущем выглядеть в стандартной библиотеке. Как с ними должен будет работать тулинг и средства документации. Расс утверждает, что это будет хорошая подготовка перед началом работы над возможными sync/v2
и encoding/json/v2
. Во вторых v2 позволяют показать преемственность пакетов и тот факт, что это не дизайн API с нуля, а набор изменений оригинального дизайна, где каждое изменение имеет под собой большое число факторов в свою пользу.
>>Click here to continue<<