2014-09-25 5 views
5

में सभी तत्वों को सूचीबद्ध करें क्या बफर्ड चैनल में सभी तत्वों को सूचीबद्ध करने के लिए कोई (विनाशकारी) तरीका है?एक buffered चैनल

एकमात्र चीज जिसे मैं सोच सकता हूं, उन सभी को चक्रबद्ध करना है, अंत में उन्हें पुन: सम्मिलित करना। यह सबसे बुद्धिमान दृष्टिकोण प्रतीत नहीं होता है।

Link to playground

c := make(chan int, 100) 
c <- 111 
c <- 222 
for i:=0;i<2;i++ { 
element := <- c 
fmt.Println(element) 
c <- element 
} 
fmt.Println(len(c)) 

उत्तर

4

यह thread from 2011 ने पीक() फ़ंक्शन को सक्षम करने के लिए एक चैनल के चारों ओर कुछ रैपर की पेशकश की, लेकिन यह किसी और चीज़ की तुलना में अधिक कामकाज था।

type PeekChanInt struct { 
     in <-chan int 
     out chan int 
} 

सामान्य निष्कर्ष था:

एक तुल्यकालिक चैनल कोई सिर (यह एक शून्य लंबाई टुकड़ा की तरह है) है

आप ऐसा नहीं कर सकते हैं कि क्योंकि

  • ए) यह अंत की बजाय कतार की पूंछ पर वापस आ जाता है और
  • बी) एक लेखक शायद जा सकता है पहले वहाँ नहीं, तो डाल ब्लॉक ब्लॉक कर सकते हैं।

मैं इस तरह की एक विशेषता चाहता था। यह भावना जब वहाँ चैनल

आप मध्यस्थ के रूप में एक प्रक्रिया अभिनय के साथ यह अनुकरण कर सकते हैं (मैं इसे चाहे वह उपभोग करने के लिए निर्णय लेने से पहले पहले माउस घटना में झांक सकते करने के लिए हिट परीक्षण करना चाहता था) का केवल एक उपभोक्ता है बना सकते हैं, लेकिन आपको इसे प्रत्येक चैनल प्रकार या खोने की सुरक्षा के लिए करना होगा।

याद रखें कोई बफरिंग, इसलिए यदि आप एक मूल्य पर एक नज़र, आप दूसरी तरफ, जो इसे पढ़ने के बराबर होगा से मूल्य भी प्राप्त करना होगा - लेकिन यह गलत है क्योंकि देखना कोई साइड इफेक्ट नहीं होनी चाहिए

+0

इस संदर्भ में इसका कोई मतलब नहीं है "कोई सिर नहीं है"? – meto

+1

@ मेटो इसका मतलब है कि कोई इंडेक्स नहीं है, एक सिर (इंडेक्स 0) और चैनल में सीधे एक विशिष्ट स्थिति तक पहुंचने की संभावना है। – VonC

4

नहीं, तुम नहीं कर सकते हैं, यदि आप ऐसा करना चाहते एक सूची के आधार पर अपने खुद के अवरुद्ध कतार लिख सकते हैं।

1

आप वास्तव में नहीं कर सकते हैं। आपके पास क्या एकमात्र तरीका है, लेकिन ऐसा न करें अगर chan पर कोई समवर्ती पहुंच है (और फिर आप चैन का उपयोग क्यों कर रहे हैं?)।

len, और आपके लूप के दौरान आइटम को डालने के बाद आइटम डाला या हटाया जा सकता है।

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