मुझे लगता है कि केवल पढ़ने के लिए चैनलों के लिए मुख्य प्रेरणा चैनल के भ्रष्टाचार और आतंक को रोकने के लिए है। कल्पना करें कि क्या आप time.After
द्वारा लौटाए गए चैनल को लिख सकते हैं। यह बहुत सारे कोड को गड़बड़ कर सकता है।
लिखने से ज्यादा बंद ये अभियान संकलन समय केवल पढ़ने के लिए चैनलों के लिए त्रुटियाँ हैं , लेकिन जब वे कई go-routines एक चैनल लिख/बंद कर सकते हैं तो वे खराब दौड़ की स्थिति पैदा कर सकते हैं। इस के आसपास होने का एक तरीका चैनलों को कभी बंद नहीं करना है और उन्हें कचरा इकट्ठा करना है। हालांकि, close
सिर्फ सफाई के लिए नहीं है, लेकिन यह वास्तव में जब चैनल पर लेकर जाता है का उपयोग किया है:
func consumeAll(c <-chan bool) {
for b := range c {
...
}
}
तो चैनल को बंद कर दिया कभी नहीं है, इस पाश अंत कभी नहीं होगा। यदि एकाधिक गो-रूटीन चैनल पर लिख रहे हैं, तो वहां बहुत सारी किताब-रख-रखाव है जिसे निर्णय लेने के साथ चलना होगा कि कौन सा चैनल बंद कर देगा।
चूंकि आप केवल-पढ़ने वाले चैनल को बंद नहीं कर सकते हैं, इसलिए यह सही कोड लिखना आसान बनाता है।जैसा कि @jimt ने अपनी टिप्पणी में बताया है, आप एक पठनीय चैनल को केवल एक लिखने योग्य चैनल में परिवर्तित नहीं कर सकते हैं, इसलिए आपको गारंटी है कि किसी चैनल के लिखने योग्य संस्करण तक पहुंच के साथ कोड के केवल कुछ भाग इसे बंद/लिख सकते हैं।
संपादित करें:
कई पाठकों होने का सवाल है, यह जब तक आप यह के लिए खाते के रूप में पूरी तरह से ठीक है,। यह विशेष रूप से उपयोगी होता है जब निर्माता/उपभोक्ता मॉडल में उपयोग किया जाता है।
func produce(l *net.TCPListener, c chan<- net.Conn) {
for {
conn, _ := l.Accept()
c<-conn
}
}
func consume(c <-chan net.Conn) {
for conn := range c {
// do something with conn
}
}
func main() {
c := make(chan net.Conn, 10)
for i := 0; i < 10; i++ {
go consume(c)
}
addr := net.TCPAddr{net.ParseIP("127.0.0.1"), 3000}
l, _ := net.ListenTCP("tcp", &addr)
produce(l, c)
}
संभावना आपके कनेक्शन की हैंडलिंग एक नया कनेक्शन को स्वीकार करने से अधिक समय है, तो आप के बहुत सारे करना चाहते हैं ले जाएगा: उदाहरण के लिए, आप है कि बस कनेक्शन स्वीकार करता है और कार्यकर्ता धागे के लिए एक कतार में उन्हें लिखते हैं एक टीसीपी सर्वर है कहना एक निर्माता के साथ उपभोक्ता। एकाधिक उत्पादक अधिक कठिन होते हैं (क्योंकि आपको चैनल को बंद करने वाले समन्वय की आवश्यकता होती है) लेकिन आप चैनल भेजने के लिए किसी प्रकार का सेमफोर-शैली चैनल जोड़ सकते हैं।
लेकिन प्राप्त करने वाले अंत में, कॉलर इसे दो तरीकों से वापस नहीं ला सकता है? यह वही है जो मैं यहां प्राप्त कर रहा हूं। इसे केवल इसे लौटकर ही रूपांतरित किया जा सकता है? – burfl
आप इसे एक लिखने योग्य संस्करण में परिवर्तित नहीं कर सकते हैं। कंपाइलर शिकायत करेगा कि चैन int टाइप करने के लिए सी (प्रकार <-chan int) को परिवर्तित नहीं किया जा सकता है। ठीक है, आप 'असुरक्षित' पैकेज का उपयोग कर सकते हैं, लेकिन यह पूरी तरह से एक अलग कहानी है। जब यह पैकेज खेल में आता है तो सभी दांव बंद हो जाते हैं। – jimt