Ktorý z nasledujúcich fragmentov kódu obsahuje chybu alebo potenciálny problém súvisiaci s prácou s kanálmi? Možnosť 1 package main func main() { ch := make(chan int) ch <- 1 } Možnosť 2 package main func main() { ch := make(chan int, 1) ch <- 1 } Možnosť 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } Možnosť 4 package main func main() { ch := make(chan int) close(ch) <-ch } Možnosť 5 package main func main() { ch := make(chan int, 3) ch <- 4 }
sobes.tech AI
Odpoveď od AI
Chyba je v možnosti 1:
package main
func main() {
ch := make(chan int)
ch <- 1
}
Tu je ustvarjen nebufferiran kanal ch := make(chan int). Pošiljanje v ta kanal ch <- 1 se blokira, dokler nekdo ne prebere iz kanala. V tem primeru ni nobenega prejemnika, zato bo program za vedno obstal (deadlock).
Možnost 2 je pravilna, saj je kanal z vgrajenim pomnilnikom velikosti 1, in pošiljanje se ne blokira, če pomnilnik ni poln.
Možnost 3 je prav tako pravilna: pošiljanje in prejemanje sta uravnotežena.
Možnost 4 je pravilna: iz zaprtega kanala je mogoče brati, branje bo vrnilo ničelno vrednost in se ne bo blokiralo.
Možnost 5 je pravilna: pomnilnik 3, poslana je ena vrednost, pomnilnik ni poln.
Na kratko, problem je le v možnosti 1 — blokada pri pošiljanju v nebufferiran kanal brez prejemnika.