Sobes.tech
Senior

Care dintre următoarele fragmente de cod conține o eroare sau o problemă potențială legată de lucrul cu canale? Opțiunea 1 package main func main() { ch := make(chan int) ch <- 1 } Opțiunea 2 package main func main() { ch := make(chan int, 1) ch <- 1 } Opțiunea 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } Opțiunea 4 package main func main() { ch := make(chan int) close(ch) <-ch } Opțiunea 5 package main func main() { ch := make(chan int, 3) ch <- 4 }

sobes.tech AI

Răspuns de la AI

Eroarea se află în Varianta 1:

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

Aici se creează un canal fără buffer ch := make(chan int). Trimiterea în acest canal ch <- 1 se blochează până când cineva citește din canal. În acest cod, nu există niciun receptor, așa că programul se va bloca pentru totdeauna (deadlock).

Varianta 2 este corectă, deoarece canalul are buffer de dimensiune 1, iar trimiterea nu se blochează dacă bufferul nu este plin.

Varianta 3 este, de asemenea, corectă: trimiterea și primirea sunt echilibrate.

Varianta 4 este corectă: se poate citi dintr-un canal închis, citirea va returna valoarea zero și nu se va bloca.

Varianta 5 este corectă: buffer de 3, se trimite o valoare, bufferul nu este plin.

În concluzie, problema este doar în Varianta 1 — blocarea la trimiterea într-un canal fără buffer și fără receptor.