lancio: tutte le goroutine sono addormentate – stallo

Dato il seguente semplice programma Go

package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) } 

Mi chiedo se qualcuno possa illuminarmi sul motivo per cui ottengo

 throw: all goroutines are asleep - deadlock! 

grazie

Non chiudendo mai il canale canale, il ciclo dell’intervallo non finirà mai.

Non è ansible inviare il risultato sullo stesso canale. Una soluzione è di usarne una diversa.

Il tuo programma potrebbe essere adattato in questo modo:

 package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // sends back the result } func main() { ch := make(chan int) rch := make(chan int) go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close (ch) // this will end the loop in the total function result := <- rch // waits for total to give the result fmt.Println("Total is ", result) } 

Anche questo è giusto.

 package main import "fmt" func main() { c := make(chan int) go do(c) c <- 1 c <- 2 // close(c) fmt.Println("Total is ", <-c) } func do(c chan int) { res := 0 // for v := range c { // res = res + v // } for i := 0; i < 2; i++ { res += <-c } c <- res fmt.Println("something") }