> Как работает алгоритм генерации уникальных чисел с генератором и map в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Ozon
Стек: Go
> Пример ответа
В Go генерация уникальных чисел с использованием генератора и map строится на комбинации итеративного подхода (генератор) и структуры данных для проверки уникальности (map). Генератор - это функция, возвращающая канал, в который последовательно отправляются числа. Для обеспечения уникальности используется map[int]bool (или map[int]struct{} для экономии памяти), где ключом служит число, а значением - флаг существования.
Пример реализации:
GOfunc uniqueNumberGenerator() <-chan int {ch := make(chan int)seen := make(map[int]struct{})go func() {defer close(ch)for i := 0; ; i++ {// Генерируем число (например, последовательно, но можно и случайно)num := iif _, exists := seen[num]; !exists {seen[num] = struct{}{}ch <- num}}}()return ch}
Здесь генератор создаёт канал и в отдельной горутине бесконечно генерирует числа, проверяя их наличие в map. Если число новое, оно добавляется в map и отправляется в канал. Потребитель может читать из канала, получая гарантированно уникальные числа.
map обеспечивает проверку уникальности за O(1) в среднем, а генератор - ленивую и асинхронную выдачу. Однако такой подход требует памяти для хранения всех сгенерированных чисел, что может быть проблемой при большом количестве уникальных значений. Для ограниченного набора (например, UUID) это не критично, но для бесконечной последовательности стоит рассмотреть альтернативы (например, использование sync.Map или хеширование).
> Похожие задачи по Go
Зачем создавать слайс с длиной и емкостью вместо использования append в Go
Для чего используется синтаксис срезов в Go
Какая основная идея воркерпула?
Когда можно закрыть канал при нескольких писателях и читателях в Go?
> Похожие задачи по backend
Зачем создавать слайс с длиной и емкостью вместо использования append в Go
Для чего используется синтаксис срезов в Go
Какая основная идея воркерпула?
Когда можно закрыть канал при нескольких писателях и читателях в Go?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью