2012-10-22 29 views
47

使用緩衝通道,如何測量通道中有多少元素?例如,我創建像這樣發送的頻道:通道中元素的數量

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

我想衡量多少封郵件都在通道send_ch

我知道,由於併發性,測量並不準確,因爲測量和動作之間可能會發生搶佔(例如在本視頻Google I/O 2012 - Go Concurrency Patterns中討論過)。我將使用它來在生產者和消費者之間進行流量控制,也就是說,一旦我通過了高水印,就改變了一些行爲,直到我通過低水位傳回。

回答

89

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

FUNC LEN(v類型)詮釋
中的LEN內置函數返回v的長度,根據其類型:

  • 陣列:數量元素v。
  • 指向數組的指針數:* v中的元素數(即使v爲零)。
  • Slice或map: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 
+2

謝謝阿爾喬姆。這是len的一種不可預料的用途 - 我會期望它返回一個頻道的容量,而不是其中的元素數量!很高興知道,再次感謝。 –

+20

如果你想要容量,那麼內置函數'cap'就可以做到。 – ANisus