1. Задача: Буферизированный канал и select
func main() {
var wg sync.WaitGroup
c := make(chan string, 3)
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
c <- "Goroutine " + strconv.Itoa(i)
}(i)
}
for { // бесконечный select
select {
case v := <-c:
fmt.Println(v)
}
}
wg.Wait()
close(c)
}Ответ
После close(c) цикл for select не завершается, что приводит к deadlock.
2. Задача: «processed» и потерянные сообщения
func run() {
ch := make(chan string)
go func() {
for m := range ch {
fmt.Println("processed:", m)
}
}()
ch <- "cmd.1"
ch <- "cmd.2"
}
func main() { run() }Ответ
Функция main завершается раньше, чем горутина успевает прочитать канал. Вывод не определен: иногда…