次の簡単な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)
}
なぜ私が得るのかについて誰かが私を教えてくれるかどうか疑問に思っています
throw: all goroutines are asleep - deadlock!
ありがとうございました
ch
チャネルを閉じることは決してないため、範囲ループは終了しません。
同じチャネルで結果を送り返すことはできません。解決策は、別のものを使用することです。
あなたのプログラムはこのように適応させることができます:
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)
}