Uczę się Go i pracuję nad this lesson z GoTours. Oto, co mam do tej pory.Jak mogę złapać wyjątek z zakleszczeniem kanału?
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)
}
}
Jak widać, próbuję przetestować moją funkcję Walk, drukując wartości, które napisałem na kanale. Jednak pojawia się następujący błąd.
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
Ten błąd należy oczekiwać myślę, bo nigdy close
kanał. Czy istnieje jednak sposób, w jaki mogę "złapać" ten błąd impasu i programowo go rozwiązać?
definicji impas oznacza, że wszystkie goroutines nie działają. Jeśli nic nie działa, nie ma goroutine, które może "złapać" wyjątek. – newacct
Dzięki! Jeśli tak jest, czy istnieje sposób, aby przestać czytać z kanału po tym, jak przeczytałem 'n' liczbę razy, gdzie' n' jest liczbą razy zapisaną w kanale? – dangerChihuahua007
Kolejna wskazówka: dobrze jest określić kierunek kanału w funkcji Spacer, tj. func Walk (t * tree.Tree, chan <- int) –