web-dev-qa-db-ja.com

スロー:すべてのゴルーチンが眠っています-デッドロック

次の簡単な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!

ありがとうございました

21
adk

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)
}
33
Denys Séguret