2012-12-27 19 views
11

यह काम करता है।चैनल प्रकार में '<-' क्यों है?

var tick <-chan time.Time = time.Tick(1e8) 

हालांकि, ऐसा नहीं है।

var tick chan time.Time = time.Tick(1e8) 

क्यों मैं एक चैनल के लिए मेरी प्रकार घोषणा में एक <- की ज़रूरत है? मैंने सोचा कि <- एक चैनल से लिखने या पढ़ने के लिए था। यह एक प्रकार में क्यों दिखाई देगा?

उत्तर

19

चैनल एक प्रकार का संकेत है कि क्या यह केवल पढ़ने के लिए है, writeonly या दोनों हो सकता है।

एक चैनल दिशा का संकेत < साथ किया जाता है - प्रकार का हिस्सा है या लोप पढ़ने/लिखने चैनल के लिए।

तो <-chan time.Time में <- प्रकार का हिस्सा है,

chan time.Time //Would be a read/writable channel 
chan<- time.Time // Would be a write only channel 
<-chan time.Time // Would be a read only channel 

और time.Tick(1e8) रिटर्न, केवल पढ़ने के चैनल है।

भाषा कल्पना here

+1

@ डेविड-फोक्स, यह भी ध्यान दें कि आप केवल 'टिक: = time.Tick (1e8)' का उपयोग कर सकते हैं और संकलक स्वचालित रूप से 'टिक' के लिए सही प्रकार प्राप्त कर सकते हैं। यह दृष्टिकोण अव्यवस्था को भी कम कर देता है। – kostix

4

में और अधिक एक अच्छा तरीका पढ़ें चैनलों के बारे में सोचना दोनों सिरों साथ पाइप के रूप में है। एक छोर वह जगह है जहां घटनाएं बहती हैं और दूसरी तरफ जहां वे बहती हैं। तो एक चैनल घोषित करना, उदा।

var c = make(chan int) 

संपूर्ण रूप से एक चैनल बनाता है - यानी दोनों सिरों के साथ। इसके विपरीत,

func consume(c <-chan int) { 
    ... 
} 

एक चैनल इनपुट पैरामीटर के साथ एक समारोह को परिभाषित करता है - एक चैनल के पठनीय अंत यानी, और

func generate(c chan<- int) { 
    ... 
} 

एक चैनल आउटपुट पैरामीटर के साथ एक समारोह को परिभाषित करता है - एक चैनल के लिखने योग्य अंत यानी । इन दोनों कार्यों में पूरा चैनल अपने वास्तविक पैरामीटर के रूप में पारित हो सकता है, या केवल उन्हें अंत की आवश्यकता हो सकती है।

ही सामान्य सिद्धांत लागू होता है जब चैनलों स्थानीय चर के रूप में या structs में फ़ील्ड के रूप में उपयोग किया जाता है।

जहां भी संभव हो, चैनल-एंड सिंटैक्स का उपयोग करना अच्छा है क्योंकि संकलक आपके द्वारा इच्छित इरादे को और अधिक अच्छी तरह से जांचने में सक्षम होगा।

दिलचस्प बात यह है occam प्रोग्रामिंग भाषा भी बराबर वाक्य रचना चिह्नित करने के लिए एक चैनल के जो अंत जो है।

0

आप एक वास्तविक घोषणा कर सकते हैं जबकि "केवल पढ़ने" या चैनल चर "केवल लिखने", यह ऐसा करने के लिए बेकार है, क्योंकि आप उनके साथ कुछ नहीं कर सकते।

"केवल पढ़ने के लिए" और "केवल लिखने" वाक्य रचना समारोह मापदंडों के लिए है। यह वाक्यविन्यास ए में "सी" या "इन" और "आउट" में "कॉन्स" जैसा अधिक है।

न ही गो चैनलों में दो "सिरों" हैं। यूनिक्स पाइप में दो फ़ाइल डिस्क्रिप्टर हैं, प्रत्येक छोर के लिए एक। चैनल प्रकार का एक ही चर दोनों पढ़ने और लिखने के लिए उपयोग किया जाता है।

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