我正在学习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) –