2012-10-22 36 views
47

Sử dụng kênh được đệm, cách đo lường số lượng yếu tố trong kênh? Ví dụ, tôi tạo ra và gửi trên một kênh như thế này:Số yếu tố trong kênh

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

Tôi muốn đo lường bao nhiêu thông điệp đang trong kênh send_ch.

Tôi biết rằng do đồng thời đo lường sẽ không chính xác, vì có thể xảy ra sự chấp thuận trước giữa đo lường và hành động (ví dụ: được thảo luận trong video này Google I/O 2012 - Go Concurrency Patterns). Tôi sẽ sử dụng điều này để kiểm soát dòng chảy giữa các nhà sản xuất và người tiêu dùng tức là một khi tôi đã đi qua một watermark cao, thay đổi một số hành vi cho đến khi tôi vượt qua trở lại thông qua một watermark thấp.

Trả lời

89

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

func len (v Type) int
Các len tích hợp chức năng trả về chiều dài của v, theo kiểu của nó:

  • Array: số lượng các phần tử trong câu
  • Con trỏ tới mảng: số phần tử trong * v (ngay cả khi v là nil).
  • Lát hoặc bản đồ: số lượng phần tử trong v; nếu v là nil, len (v) bằng không.
  • Chuỗi: số byte trong v.
  • Kênh: số lượng phần tử được xếp hàng (chưa đọc) trong bộ đệm kênh; nếu v là nil, len (v) bằng không.
package main 

import "fmt" 

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

chí đầu ra:

34 
+2

Cảm ơn Artem. Đó là một việc sử dụng không mong đợi của len - tôi đã mong đợi nó sẽ trả về dung lượng của một kênh, chứ không phải số lượng các phần tử trong đó! Tốt để biết, cảm ơn một lần nữa. –

+20

Nếu bạn muốn sử dụng công suất, thì chức năng tích hợp 'cap' sẽ thực hiện. – ANisus