2012-09-12 23 views
6

में त्रुटि से बाहर निकलें स्थिति 2" त्रुटि मैं चैनल में चैनल सीखने के लिए एक सरल प्रोग्राम बनाने की कोशिश कर रहा हूं। लेकिन मैं एक गतिरोध त्रुटि है, जो मैं"सभी goroutines सो रहे हैं - डेडलॉक! प्रिंटर-रिसीवर प्रोग्राम

package main 

import (
    "fmt" 
    "time" 
) 

func printer(c chan int) { 
    for i := 0; i < 10; i++ { 
     c <- i 
     time.Sleep(time.Second) 
    } 
} 

func reciever(c chan int) { 
    for { 
     recievedMsg := <-c 
     fmt.Println(recievedMsg) 
    } 
} 

func main() { 
    newChanel := make(chan int) 
    printer(newChanel) 
    reciever(newChanel) 
} 

मेरे प्रारंभिक विचार यह पता लगाने नहीं कर सकते करने के लिए चल रहा है सो समारोह के बारे में कुछ था, लेकिन यहां तक ​​कि अगर मैं इस में शामिल नहींं मैं अभी भी इस में चलाने त्रुटि और निकास संदेश। क्या कोई इसे हल करने के बारे में कुछ संकेत दे सकता है?

अग्रिम

उत्तर

8

धन्यवाद आप दो निष्पादन धागे की जरूरत है, क्योंकि अब वहाँ के लिए के रूप में आप printer समारोह छोड़ कभी नहीं reciever समारोह के नाम से जाना कोई रास्ता नहीं है। आपको उनमें से एक को अलग गोरौटाइन पर निष्पादित करने की आवश्यकता है।

आपको चैनल को close चैनल भी करना चाहिए और अपने लूप में range ऑपरेटर का उपयोग करना चाहिए, ताकि चैनल बंद होने पर यह समाप्त हो जाए।

func printer(c chan int) { 
    for i := 0; i < 10; i++ { 
     c <- i 
     time.Sleep(time.Second) 
    } 
    close(c) 
} 

func reciever(c chan int) { 
    for recievedMsg := range c { 
     fmt.Println(recievedMsg) 
    } 
} 

func main() { 
    newChanel := make(chan int) 
    go printer(newChanel) 
    reciever(newChanel) 
} 
+0

धन्यवाद:

तो मैं आप इस कोड का प्रस्ताव। मैंने इसे आपकी युक्तियों के अनुसार संशोधित किया, और 0 - 9 प्रिंटों से सभी संख्याएं लेकिन फिर मुझे इसके बाद एक ही त्रुटि मिल गई। मैंने यह भी जोड़ा: \t var इनपुट स्ट्रिंग fmt.Scanln (और इनपुट) लेकिन संख्याओं को मुद्रित करने के बाद मुझे एक ही त्रुटि मिलती है। कोई आइडिया है कि मैं क्या गलत कर रहा हूँ? – miner

+0

मैंने प्रिंटर को एक नियमित दिनचर्या बनाने के अलावा'go reciever 'जोड़ा, और फिर यह त्रुटियों के बिना 0 - 9 प्रिंट करता है। – miner

+0

मैंने सटीक रूप से संपादित किया कि चैनल बंद होने पर आपको चैनल को बंद करना और अंत रिसेप्शन कैसे करना चाहिए। यह क्लीनर (और अधिक पुन: प्रयोज्य) लगता है। –