[go] 채널의 요소 수

버퍼링 된 채널을 사용하여 채널에있는 요소 수를 어떻게 측정합니까? 예를 들어 다음과 같은 채널을 만들고 전송합니다.

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

send_ch 채널에 얼마나 많은 메시지 가 있는지 측정하고 싶습니다 .

동시성으로 인해 측정과 작업 사이에 선점이 발생할 수 있으므로 측정이 정확하지 않다는 것을 알고 있습니다 (예 :이 동영상 Google I / O 2012-Go Concurrency Patterns 에서 논의 됨 ). 나는 이것을 생산자와 소비자 사이의 흐름 제어를 위해 사용할 것입니다.



답변

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

func len (v Type) int
len 내장 함수는 유형에 따라 v의 길이를 반환합니다.

  • 배열 : v의 요소 수.
  • 배열에 대한 포인터 : * v의 요소 수 (v가 nil 인 경우에도).
  • 슬라이스 또는 맵 : v의 요소 수; v가 nil이면 len (v)는 0입니다.
  • 문자열 : v의 바이트 수.
  • 채널 : 채널 버퍼에서 큐에 넣은 (읽지 않은) 요소의 수. v가 nil이면 len (v)는 0입니다.
package main

import "fmt"

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

다음을 출력합니다.

34


답변