Sobes.tech
Senior

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.