2017-03-22 14 views
2
package main 

import "fmt" 

var money int = 100 
var update = make(chan int) 

func updateM(count int) { 
    update<- count 
} 

func main() { 
    updateM(200) 
    fmt.Println(<-update) 

} 

が、私はその後、エラーがこのチャネル操作でデッドロックエラーが表示されるのはなぜですか?

func main() { 
     go updateM(200) 
     fmt.Println(<-update) 

    } 

誰でも私は行くの新しい学習者です、私に言うことができなかったupdateM(200) の前に行くを追加するために、コードを変更します。どうもありがとう。

答えて

2

バッファされていないチャネルへの書き込みは、他端で誰かが読み込むまでブロックされます。あなたのケースでは、updateMは、続行するために無期限にブロックされます。チャンネルから読み込むことができないように続行する必要があります。

チャンネルは、ゴルーチン間の通信のためのもので、自分と話すのに意味がありません。 documentationから

4

受信値を受信するまでチャネルは、送信側ブロックバッファリングされていない場合。チャネルにバッファがある場合、送信側は値がバッファにコピーされるまでブロックします。バッファがいっぱいであれば、受信者が値を取得するまで待つことを意味します。

は、あなたはそれのブロックの前に、チャネル内の1つの項目の余地がありますように、それは

var update = make(chan int, 1) 

にチャネルの作成を変更することにより、ブロックしていないことができます。

+0

ご協力ありがとうございます –

関連する問題