Sobes.tech
Senior

Кой от следните фрагменти с код съдържа грешка или потенциален проблем, свързан с работата с канали? Опция 1 package main func main() { ch := make(chan int) ch <- 1 } Опция 2 package main func main() { ch := make(chan int, 1) ch <- 1 } Опция 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } Опция 4 package main func main() { ch := make(chan int) close(ch) <-ch } Опция 5 package main func main() { ch := make(chan int, 3) ch <- 4 }

sobes.tech AI

Отговор от AI

Грешката е в Вариант 1:

package main
func main() {
    ch := make(chan int)
    ch <- 1
}

Тук се създава небуфериран канал ch := make(chan int). Изпращането към този канал ch <- 1 се блокира, докато някой не прочете от канала. В този код няма получател, затова програмата ще блокира завинаги (deadlock).

Вариант 2 е правилен, тъй като каналът е с буфер с размер 1, и изпращането не се блокира, ако буферът не е пълен.

Вариант 3 също е правилен: изпращането и получаването са балансирани.

Вариант 4 е правилен: може да се чете от затворен канал, четенето ще върне нулева стойност и няма да блокира.

Вариант 5 е правилен: буфер 3, изпраща се една стойност, буферът не е пълен.

Обобщено, проблемът е само в Вариант 1 — блокиране при изпращане към небуфериран канал без получател.