我正在學習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)
}
}
正如您所看到的,我嘗試通過打印出我寫入通道的值來測試我的Walk功能。但是,我收到以下錯誤。
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
另一個提示:在Walk功能中指定通道方向是一種很好的做法,例如 func Walk(t * tree.Tree,ch chan < - int) –