> Как работает алгоритм генерации уникальных чисел с генератором и map в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

В Go генерация уникальных чисел с использованием генератора и map строится на комбинации итеративного подхода (генератор) и структуры данных для проверки уникальности (map). Генератор - это функция, возвращающая канал, в который последовательно отправляются числа. Для обеспечения уникальности используется map[int]bool (или map[int]struct{} для экономии памяти), где ключом служит число, а значением - флаг существования.

Пример реализации:

GO
func uniqueNumberGenerator() <-chan int {
ch := make(chan int)
seen := make(map[int]struct{})
go func() {
defer close(ch)
for i := 0; ; i++ {
// Генерируем число (например, последовательно, но можно и случайно)
num := i
if _, exists := seen[num]; !exists {
seen[num] = struct{}{}
ch <- num
}
}
}()
return ch
}

Здесь генератор создаёт канал и в отдельной горутине бесконечно генерирует числа, проверяя их наличие в map. Если число новое, оно добавляется в map и отправляется в канал. Потребитель может читать из канала, получая гарантированно уникальные числа.

map обеспечивает проверку уникальности за O(1) в среднем, а генератор - ленивую и асинхронную выдачу. Однако такой подход требует памяти для хранения всех сгенерированных чисел, что может быть проблемой при большом количестве уникальных значений. Для ограниченного набора (например, UUID) это не критично, но для бесконечной последовательности стоит рассмотреть альтернативы (например, использование sync.Map или хеширование).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью