107

バッファリングされたチャネルを使用して、チャネル内の要素数をどのように測定しますか? たとえば、次のようなチャネルを作成して送信しています。

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

チャネル send_ch に含まれるメッセージの数を測定したい。

測定とアクションの間にプリエンプションが発生する可能性があるため、同時実行性のために測定が正確ではないことを認識しています (たとえば、このビデオGoogle I/O 2012 - Go Concurrency Patternsで説明されています)。プロデューサーとコンシューマーの間のフロー制御にこれを使用します。つまり、ハイ ウォーターマークを通過したら、ロー ウォーターマークを通過するまでいくつかの動作を変更します。

4

1 に答える 1

187

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

func len(v Type) int
組み込み関数 len は、その型に応じて v の長さを返します。

  • 配列: v の要素数。
  • 配列へのポインタ: *v の要素数 (v が nil であっても)。
  • スライス、またはマップ: v の要素の数。v が nil の場合、len(v) はゼロです。
  • 文字列: v のバイト数。
  • チャネル: チャネル バッファでキューに入れられた (未読の) 要素の数。v が nil の場合、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
于 2012-10-22T01:10:00.407 に答える