Нужен генератор целых чисел: каждый вызов возвращает число на 1 больше
предыдущего. Код, который им пользуется, менять нельзя:
next := makeCounter()
fmt.Println(next()) // 1
fmt.Println(next()) // 2
fmt.Println(next()) // 3
func makeCounter() func() int
Требования
- Первый вызов возвращает 1, каждый следующий — на 1 больше.
- Счётчики независимы: у каждого результата
makeCounter() своя
последовательность.
- Никаких глобальных переменных.
func makeSafeCounter() func() int
- То же поведение, но
next вызывают одновременно из многих горутин.
- Каждое число выдаётся ровно один раз: за N вызовов в сумме получаются ровно
числа 1..N, без повторов и пропусков.
- Код проходит
go test -race.
Устно: где живёт переменная, которую захватило замыкание, — на стеке или в
куче? Как сделать такой генератор через канал и чем это хуже?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.