2014-10-10 6 views
5

मैं इस तरह समारोह लिखने के लिए कोशिश कर रहा हूँ में चान (चैनल) का एक टुकड़ा घोषणा कर सकते हैं, लेकिन मैं चैनलों की टुकड़ा की घोषणा नहीं कर सकते हैं एक है करने के लिए जाओ मेंकैसे मैं समारोह

func fanIn(set <-[]chan string) <-chan string { 
    c := make(chan string) 

    for i := range set { 
     go func() { for {c <-set[i]} }() 
    } 
    return c 
} 

यह संभव है चैनल के टुकड़े तर्क के रूप में?

कॉल

set := [2]chan string{mylib.Boring("Joe"), mylib.Boring("Ann")} 
c := fanIn(set) 

का उदाहरण अगर मैं इस

func fanIn(input1, input2 <-chan string) <-chan string { 

मुझे लगता है कि यह टुकड़ा या "< चान स्ट्रिंग"

की सारणी रखने के लिए संभव हो जाना चाहिए क्या कर सकते हैं अपडेट किया गया:

func fanIn(set []<-chan string) <-chan string { 
    c := make(chan string) 

    for i := range set { 
     go func() { 
      for { 
       x := <-set[i] 
       c <- x 
      } 
     }() 
    } 

    return c 
} 

func main() { 
    set := []<-chan string{mylib.Boring("Joe"), mylib.Boring("Ann"), mylib.Boring("Max")} 
    c := fanIn(set) 
    for i := 0; i < 10; i++ { 
     fmt.Println(<-c) 
    } 
    fmt.Println("You're boring: I'm leaving.") 
} 
+0

आपको शायद ही कभी अपने सार्वजनिक एपीआई से चैनल लौटाना चाहिए, इसके बजाए एक चैनल को उस तर्क के रूप में ले जाएं जिसे आप भेजते हैं। आप अपने एकल बोरिंग कॉल में इस एकल चैनल का उपयोग कर सकते हैं और प्रशंसक की भी आवश्यकता नहीं होगी। – Wessie

+0

आप https://godoc.org/github.com/eapache/channels#Multiplex का भी उपयोग कर सकते हैं जो प्रत्येक इनपुट चैनल के लिए एक संपूर्ण goroutine spawning से बचने के लिए 'चयन' का उपयोग करता है। – Evan

उत्तर

4

मैं अपने कार्य में वाक्य रचना तय थोड़ा, अब यह संकलित:

func fanIn(set []<-chan string) <-chan string { 
    c := make(chan string) 


    for i := range set { 
     // here is the main change - you receive from one channel and send to one. 
     // the way you wrote it, you're sending the channel itself to the other channel 
     go func() { for {c <- <- set[i]} }() 
    } 
    return c 
} 
BTW पठनीयता के कारण

, मैं के रूप में लिखते हैं:

go func() { 
     for { 
      x := <-set[i] 
      c <- x 
     } 
    }() 

संपादित करें: आपके वास्तविक कोड को goroutine के अंदर set[i] का उपयोग करने की समस्या थी, जिससे वे सभी अंतिम चैनल से पढ़ सकते थे। यहां एक निश्चित संस्करण है:

func fanIn(set []<-chan string) <-chan string { 
    c := make(chan string) 

    for i := range set { 
     go func(in <-chan string) { 
      for { 
       x := <- in 
       c <- x 
      } 
     }(set[i]) 
    } 
    return c 
} 
+1

बढ़िया! आपका बहुत बहुत धन्यवाद! मुझे एक अजीब तस्वीर दिखाई देती है। जब मैं fanIn (set) को कॉल करने का प्रयास करता हूं तो मुझे परिणाम के रूप में केवल अंतिम चैन मिला। – qwertmax

+1

@qwertmax बेशक, यह 'i' के कारण है, मुझे इस जवाब में सही होने के लिए मेरे उत्तर को ठीक करने दें –

+0

@qwertmax अब देखें –

संबंधित मुद्दे