Sobes.tech
Senior

Kuris iš šių kodų fragmentų turi klaidą arba potencialią problemą, susijusią su kanalų darbu? 1 variantas package main func main() { ch := make(chan int) ch <- 1 } 2 variantas package main func main() { ch := make(chan int, 1) ch <- 1 } 3 variantas package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } 4 variantas package main func main() { ch := make(chan int) close(ch) <-ch } 5 variantas package main func main() { ch := make(chan int, 3) ch <- 4 }

sobes.tech AI

Atsakymas iš AI

Klaida yra 1-ame variante:

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

Čia sukuriamas nebuferinis kanalas ch := make(chan int). Siuntimas į šį kanalą ch <- 1 užstringa, kol kas nors neskaito iš kanalo. Šiame kode nėra gavėjo, todėl programa amžinai užstringa (deadlock).

2-asis variantas yra teisingas, nes kanalas su buferiu, kurio dydis 1, ir siuntimas neblokuojasi, jei buferis nėra pilnas.

3-iasis variantas taip pat teisingas: siuntimas ir gavimas yra subalansuoti.

4-asis variantas teisingas: galima skaityti iš uždaryto kanalo, skaitymas grąžins nulines reikšmes ir neblokuos.

5-asis variantas teisingas: buferis 3, siunčiama viena reikšmė, buferis nėra pilnas.

Apibendrinant, problema yra tik 1-ame variante — užstringa siunčiant į nebuferinį kanalą be gavėjo.