Który z poniższych fragmentów kodu zawiera błąd lub potencjalny problem związany z pracą z kanałami? Opcja 1 package main func main() { ch := make(chan int) ch <- 1 } Opcja 2 package main func main() { ch := make(chan int, 1) ch <- 1 } Opcja 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } Opcja 4 package main func main() { ch := make(chan int) close(ch) <-ch } Opcja 5 package main func main() { ch := make(chan int, 3) ch <- 4 }
sobes.tech AI
Odpowiedź od AI
Błąd znajduje się w Opcji 1:
package main
func main() {
ch := make(chan int)
ch <- 1
}
Tutaj tworzony jest niebuforowany kanał ch := make(chan int). Wysyłanie do takiego kanału ch <- 1 blokuje się, dopóki ktoś nie odczyta z kanału. W tym kodzie nie ma żadnego odbiorcy, więc program zawiesi się na zawsze (deadlock).
Opcja 2 jest poprawna, ponieważ kanał ma bufor o rozmiarze 1, a wysyłka nie blokuje się, jeśli bufor nie jest pełny.
Opcja 3 jest również poprawna: wysyłanie i odbieranie są zrównoważone.
Opcja 4 jest poprawna: można czytać z zamkniętego kanału, odczyt zwróci wartość zerową i nie zablokuje się.
Opcja 5 jest poprawna: bufor 3, wysyła się jedną wartość, bufor nie jest pełny.
Podsumowując, problem występuje tylko w Opcji 1 — blokada podczas wysyłania do niebuforowanego kanału bez odbiorcy.