私はGoを学習しており、GoToursからthis lessonに取り組んでいます。ここに私がこれまで持っているものがあります。チャネルのデッドロックの例外をキャッチするにはどうすればよいですか?
package main
import (
"fmt"
"code.google.com/p/go-tour/tree"
)
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
if t != nil {
Walk(t.Left, ch)
ch <- t.Value
Walk(t.Right, ch)
}
}
func main() {
var ch chan int = make(chan int)
go Walk(tree.New(1), ch)
for c := range ch {
fmt.Printf("%d ", c)
}
}
ご覧のとおり、私はチャンネルに書き込んだ値を印刷してウォーク機能をテストしようとします。しかし、私は次のエラーが発生します。
1 2 3 4 5 6 7 8 9 10 throw: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
main.go:25 +0x85
goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221
exit status 2
このエラーは、私がチャンネルをclose
ことはありませんので、私は考えて期待されなければなりません。しかし、このデッドロックエラーを "キャッチ"してプログラムで処理できる方法はありますか?
:あなたは並列でツリーを走査する場合は、さらに変更を加える必要があります
を実行されていません。何も実行されていない場合、例外を "キャッチ"できるゴルーチンは存在しません。 – newacct
ありがとう!そうであれば、「n回」の回数を読み込んだ後、チャンネルから読み上げをやめる方法がありますか?「n」はチャンネルに書き込んだ回数です。 – dangerChihuahua007
別のヒント:ウォーク機能でチャンネルの方向を指定することをお勧めします。 func Walk(t * tree.Tree、ch chan < - int) –