Senior
galvenais pakets importēt ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Sveika, pasaule!" fmt.Println("Išeiti!") } mirtina klaida: visi gorutinai miega - deadlock! goroutine 1 [kanāla saņemšana]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programma beidzās: stāvoklis 2.
sobes.tech AI
Atbilde no AI
fatal error: all goroutines are asleep - deadlock! kļūda rodas, kad visas gorutīnas ir bloķētas un neviena nevar turpināt.
Šajā kodā:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Kanāls c ir izveidots bez bufera, tāpēc sūtīšanas (c <-) un saņemšanas (<-c) operācijām jānotiek vienlaikus.
Skaidrojums:
- Gorutīna
go fmt.Println(<-c)mēģina saņemt vērtību no kanālac. - Galvenā gorutīna mēģina nosūtīt vērtību
"Hello World!"uz kanālac.
Tomēr, tā kā fmt.Println(<-c) darbojas atsevišķā gorutīnā, un sūtīšana notiek galvenajā gorutīnā, var rasties situācija, kad saņemšanas gorutīna vēl nav gatava saņemt datus, un galvenā gorutīna bloķējas uz sūtīšanas.
Rezultātā abas gorutīnas bloķējas: viena gaida sūtīšanu, otra — saņemšanu, bet neviena nevar turpināt — rodas deadlock.
Lai to novērstu, var:
- Izmantot buferētu kanālu, piemēram,
c := make(chan string, 1), lai sūtīšana nenobloķētos. - Vai mainīt operāciju secību, vispirms sūtot, tad lasot.
Piemērs ar buferi:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Tagad programma darbosies bez deadlock.