使用缓冲通道,如何测量通道中有多少元素?例如,我正在创建并发送一个频道,如下所示:

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

我想测量一下send_ch频道有多少个msgs.

我知道由于并发性,测量不会准确,因为在测量和操作之间可能会发生抢占(例如在这个视频Google I/O 2012 - Go Concurrency Patterns中讨论的).我将用它来控制生产者和消费者之间的流量(一旦我通过了高水位线,改变了一些行为,直到我通过低水位线为止).

推荐答案

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

func len(v Type) int
The len built-in function returns the length of v, according to its type:

  • Array:v中的元素数.
  • 指向数组的指针:*v中的元素数(即使v为空).
  • Slice或map:v中的元素数量;如果v为零,则len(V)为零.
  • String:v中的字节数.
  • CHANNEL:通道缓冲区中排队(未读)的元素数;如果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

Go相关问答推荐

Go 1.22 http mux:在同一路径上提供一个手柄和一个FS

语法-for循环中的initit陈述是否允许分配?

SEARCH On Conflict Clause不考虑乐观锁定版本

无法在Macos上使用Azure Speech golang SDK

Go中的net.SplitHostPort(r.RemoteAddr)安全性

如何获取集群外go Kubernetes客户端的当前命名空间?

使用Dockertest进行Golang SQL单元测试的基本设置

无法使用带有 422 的 go-github 创建提交 - 更新不是快进

你如何在 Golang 代码中测试 filepath.Abs​​ 失败?

具有两个参数的动态规划:天数和优惠券

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

如何仅提取时间作为持续时间

使用 GO 在侧 tar 文件中提取 tar 文件的最快方法

GRPC 元数据未在 Go 中更新

如何在 golang revel 中获取动态应用程序配置

如何使用 Status 字段创建 Kubernetes 对象?

try 运行 docker-compose up -d 时出现错误

没有堆栈跟踪的 go 程序崩溃是什么意思?

转到文本/模板模板:如何根据模板本身的值数组判断值?

Golang 泛型同时具有接口和实现