Sobes.tech
Senior

Který z následujících fragmentů kódu obsahuje chybu nebo potenciální problém související s prací s kanály? Možnost 1 package main func main() { ch := make(chan int) ch <- 1 } Možnost 2 package main func main() { ch := make(chan int, 1) ch <- 1 } Možnost 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } Možnost 4 package main func main() { ch := make(chan int) close(ch) <-ch } Možnost 5 package main func main() { ch := make(chan int, 3) ch <- 4 }

sobes.tech AI

Odpověď od AI

Chyba je v možnosti 1:

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

Zde je vytvořen nebufferovaný kanál ch := make(chan int). Odeslání do tohoto kanálu ch <- 1 se zablokuje, dokud někdo ne přečte z kanálu. V tomto kódu není žádný příjemce, takže program se navždy zasekne (deadlock).

Možnost 2 je správná, protože kanál je s bufferem velikosti 1, a odeslání se nezablokuje, pokud není buffer plný.

Možnost 3 je také správná: odeslání a příjem jsou vyvážené.

Možnost 4 je správná: lze číst z uzavřeného kanálu, čtení vrátí nulovou hodnotu a nezablokuje se.

Možnost 5 je správná: buffer 3, odesílá se jedna hodnota, buffer není plný.

Stručně řečeno, problém je pouze v možnosti 1 — blokování při odesílání do nebufferovaného kanálu bez příjemce.