A következő kódrészletek közül melyik tartalmaz hibát vagy potenciális problémát a csatornákkal való munkában? Változat 1 package main func main() { ch := make(chan int) ch <- 1 } Változat 2 package main func main() { ch := make(chan int, 1) ch <- 1 } Változat 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } Változat 4 package main func main() { ch := make(chan int) close(ch) <-ch } Változat 5 package main func main() { ch := make(chan int, 3) ch <- 4 }
sobes.tech MI
Válasz az MI-től
Hiba az 1. változatban található:
package main
func main() {
ch := make(chan int)
ch <- 1
}
Itt egy nem pufferelt csatorna jön létre ch := make(chan int). A csatornába való küldés ch <- 1 blokkol, amíg valaki nem olvas a csatornából. Ebben a kódban nincs fogadó, ezért a program örökre meg fog állni (deadlock).
A 2. változat helyes, mert a csatorna pufferelt, mérete 1, és a küldés nem blokkol, ha a puffer nincs tele.
A 3. változat szintén helyes: a küldés és fogadás kiegyensúlyozott.
A 4. változat helyes: lezárt csatornából lehet olvasni, az olvasás null értéket ad vissza, és nem blokkol.
Az 5. változat helyes: 3-as puffer, egy érték kerül küldésre, a puffer nem tele.
Összefoglalva, a probléma csak az 1. változatban van — blokkolás nem pufferelt csatornára küldéskor, ha nincs fogadó.