6

Go でチャネルを学習するための簡単なプログラムを作成しようとしています。しかし、私は理解できないデッドロックエラーに遭遇しています

package main

import (
    "fmt"
    "time"
)

func printer(c chan int) {
    for i := 0; i < 10; i++ {
        c <- i
        time.Sleep(time.Second)
    }
}

func reciever(c chan int) {
    for {
        recievedMsg := <-c
        fmt.Println(recievedMsg)
    }
}

func main() {
    newChanel := make(chan int)
    printer(newChanel)
    reciever(newChanel)
}

私の最初の考えはスリープ機能に関するものでしたが、これを含めなくても、このエラーに遭遇して終了メッセージが表示されます。誰かがこれを解決する方法についていくつかのヒントを与えることができますか?

前もって感謝します

4

1 に答える 1

8

reciever関数を離れることがないため、関数を呼び出す方法がないため、2つの実行スレッドが必要ですprinter。それらの1つを別のゴルーチンで実行する必要があります。

また、チャネルを閉じたときに終了するように、チャネルとループで演算子closeを使用する必要があります。range

だから私はあなたにこのコードを提案します:

func printer(c chan int) {
    for i := 0; i < 10; i++ {
        c <- i
        time.Sleep(time.Second)
    }
    close(c)
}

func reciever(c chan int) {
    for recievedMsg := range c {
        fmt.Println(recievedMsg)
    }
}

func main() {
    newChanel := make(chan int)
    go printer(newChanel)
    reciever(newChanel)
}
于 2012-09-12T15:16:35.890 に答える