Số phần tử trong một kênh


86

Sử dụng kênh đệm, làm cách nào để đo lường có bao nhiêu phần tử trong kênh? Ví dụ: tôi đang tạo và gửi trên một kênh như thế này:

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

Tôi muốn đo có bao nhiêu tin nhắn trong kênh send_ch .

Tôi biết rằng do đồng thời, phép đo sẽ không chính xác, vì có thể xảy ra tính trước giữa phép đo 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 nhà sản xuất và người tiêu dùng, tức là khi tôi đã đi qua hình mờ cao, thay đổi một số hành vi cho đến khi tôi chuyển trở lại qua hình mờ thấp.

Câu trả lời:


150

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

func len (v Type) int
Hàm tích hợp trong len trả về độ dài của v, theo kiểu của nó:

  • Array: số phần tử trong v.
  • Con trỏ tới mảng: số phần tử trong * v (ngay cả khi v là nil).
  • Slice, or map: số 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ố phần tử được xếp hàng đợi (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))
}

sẽ xuất:

34

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

39
Nếu bạn muốn có dung lượng, thì chức năng tích hợp capsẽ làm được điều đó.
ANisus

6
Điều tôi thấy thú vị ở đây là nếu kênh được tạo mà không có dung lượng ( c := make(chan int)) thì bạn không thể có được độ dài của nó. Tôi không tìm thấy lý do cho điều này. Vâng, công suất của nó cũng trả về 0
Brettski

Tôi cảm thấy kỳ lạ khi nó không có bộ đệm, tôi không thể hiểu được chiều dài của nó. Và khi sử dụng goroutines, nó sẽ rối tung lên.
Berkant Ipek

6
@Brettski và Berkant, Nếu kênh không có bộ đệm (dung lượng = 0), độ dài sẽ luôn bằng 0. Người gửi chặn cho đến khi người nhận nhận được giá trị. golang.org/doc/effective_go.html#channels
Farshid T
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.