एक चैनल में तत्वों की संख्या


86

एक बफर चैनल का उपयोग करके, चैनल में कितने तत्व हैं, यह कैसे मापें? उदाहरण के लिए, मैं इस तरह से एक चैनल बना रहा हूं और भेज रहा हूं:

send_ch := make(chan []byte, 100)
// code
send_ch <- msg

मैं मापने के लिए कितने चाहते msgs चैनल में हैं send_ch

मुझे पता है कि संगामिति के कारण माप सटीक नहीं होगा, क्योंकि माप और क्रिया के बीच पूर्व-उत्सर्जन हो सकता है (जैसे कि इस वीडियो में चर्चा की गई है Google I / O 2012 - Go Concurrency पैटर्न्स )। मैं इसका उपयोग उत्पादकों और उपभोक्ताओं के बीच प्रवाह नियंत्रण के लिए कर रहा हूँ अर्थात एक बार जब मैं एक उच्च वॉटरमार्क से गुज़रा हूँ, तब तक कुछ व्यवहार बदलकर जब तक मैं एक कम वॉटरमार्क से नहीं गुज़रता।

जवाबों:


150

http://golang.org/pkg/builtin/#len

func len (v टाइप) int
len बिल्ट-इन फ़ंक्शन अपने प्रकार के अनुसार v की लंबाई लौटाता है:

  • ऐरे: v में तत्वों की संख्या।
  • सूचक से सरणी: तत्वों की संख्या * v (भले ही v शून्य हो)।
  • टुकड़ा, या नक्शा: v में तत्वों की संख्या; यदि v शून्य है, तो len (v) शून्य है।
  • स्ट्रिंग: v में बाइट्स की संख्या।
  • चैनल: चैनल बफर में पंक्तिबद्ध (अपठित) तत्वों की संख्या; यदि v शून्य है, तो len (v) शून्य है।
package main

import "fmt"

func main() {
        c := make(chan int, 100)
        for i := 0; i < 34; i++ {
                c <- 0
        }
        fmt.Println(len(c))
}

उत्पादन होगा:

34

4
धन्यवाद आर्टेम। यह लेन की एक गैर-अपेक्षित उपयोग है - मुझे उम्मीद है कि यह एक चैनल की क्षमता वापस करेगा, इसमें तत्वों की संख्या नहीं! जानकर अच्छा लगा, एक बार फिर धन्यवाद।
सोनिया हैमिल्टन

39
यदि आप क्षमता चाहते हैं, तो अंतर्निहित फ़ंक्शन capइसे करेगा।
एनिसस

6
मुझे यहां जो दिलचस्प लगा वह यह है कि अगर चैनल क्षमता के बिना बनाया गया है ( c := make(chan int)तो आप लंबाई नहीं पा सकते हैं। मुझे इसका कोई कारण नहीं मिला। हां, यह क्षमता के रूप में 0 के रूप में रिटर्न
ब्रेटस्की

मुझे अजीब लगता है कि जब यह अप्रभावित रहता है, तो मुझे इसकी लंबाई नहीं मिल सकती है। और गोरोइन का उपयोग करते समय, यह थोड़े गड़बड़ कर देता है।
बेरकेंट इपेक

6
@ ब्रेटस्की और बर्केंट, यदि चैनल अप्रभावित है (क्षमता = 0), तो लंबाई हमेशा शून्य होगी। जब तक रिसीवर को मूल्य प्राप्त नहीं होता तब तक प्रेषक ब्लॉक करता है। golang.org/doc/effective_go.html#channels
T
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.