Нужно исправить тип параметра канала, убрать лишний mutex и закрыть канал после WaitGroup. Бесконечный цикл сейчас не достигает wg.Wait.
// Исправить код
Нужно исправить тип параметра канала, убрать лишний mutex и закрыть канал после WaitGroup. Бесконечный цикл сейчас не достигает wg.Wait.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// Исправить код func FixProblem() { var wg sync.WaitGroup ch := make(chan string, 5) mu := sync.Mutex{} for i := 0; i < 5; i++ { wg.Add(1) go func(ch<- string, i int, wg *sync.WaitGroup) { defer wg.Done() mu.Lock() defer mu.Unlock() msg := fmt.Sprintf("Goroutine %s", strconv.Itoa(i)) ch <- msg }(ch, i, &wg) } for { select { case q := <-ch: fmt.Println(q) } } wg.Wait() }
Ответ
Нужно исправить тип параметра канала, убрать лишний mutex и закрыть канал после WaitGroup. Бесконечный цикл сейчас не достигает wg.Wait.
Вариант (нужны fmt и sync):
func FixProblem() {
var wg sync.WaitGroup
ch := make(chan string, 5)
for i := 0; i < 5; i++ {
wg.Add(1)
go func(out chan<- string, i int) {
defer wg.Done()
out <- fmt.Sprintf("Goroutine %d", i)
}(ch, i)
}
go func() {
wg.Wait()
close(ch)
}()
for msg := range ch {
fmt.Println(msg)
}
}
Канал уже поддерживает конкурентные отправки, поэтому mutex не нужен. В исходнике параметр ch<- string синтаксически неверен. Без закрытия после пяти сообщений чтение ждало бы бесконечно; чтение закрытого канала без ok/range, напротив, создало бы цикл нулевых значений. Порядок строк не фиксирован.