मैं गो सीख रहा हूं और 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
चैनल। हालांकि, क्या कोई तरीका है कि मैं इस डेडलॉक त्रुटि को "पकड़" सकता हूं और प्रोग्रामेटिक रूप से इसका सामना कर सकता हूं?
परिभाषा के अनुसार, एक गतिरोध मतलब है कि सभी goroutines दौड़ नहीं रहे हैं यदि कुछ भी नहीं चल रहा है, तो कोई गोरौटाइन नहीं है जो अपवाद को "पकड़" सकता है। – newacct
धन्यवाद! यदि ऐसा है, तो क्या मैं एक तरीका है जिसे मैंने चैनल से पढ़ना बंद कर दिया है, जब मैंने 'n' बार पढ़ा है, जहां' n' चैनल में मैंने कितनी बार लिखा है? – dangerChihuahua007
एक और युक्ति: वाक फ़ंक्शन में चैनल दिशा निर्दिष्ट करना अच्छा अभ्यास है, यानी func Walk (t * tree.Tree, ch chan <- int) –