generics - 在golang中监控chan T丰满度
问题描述
有几个通道可以监控,它们的类型不同且不相关(因为我们只关心 len 和 cap),但是 golang 编译器不接受以下代码,无论 T 是什么:
func monitorChan(ch chan T) {
for {
if len(ch) == cap(ch) {
log.Warn("log")
}
time.Sleep(chanMonitorInterval)
}
}
它显示错误:
不能在 monitorChan 的参数中使用 ch (type chan []byte) 作为 type chan interface {}。
如何修改此函数以编写一次监视每个通道?
这是我的代码:
package main
import (
"fmt"
"time"
)
func monitorChan(ch chan interface{}) {
for {
if len(ch) == cap(ch) {
fmt.Println("log")
}
time.Sleep(1 * time.Second)
}
}
func main() {
ch := make(chan []byte, 100)
go monitorChan(ch)
// actual things below ...
}
游乐场: https: //play.golang.org/p/t7T28IpLNA
解决方案
使用反射。例如,
package main
import (
"log"
"reflect"
"time"
)
func monitorChan(ch interface{}, intvl time.Duration) {
v := reflect.ValueOf(ch)
if v.Kind() != reflect.Chan {
return
}
c := v.Cap()
if c == 0 {
return
}
for {
if l := v.Len(); l == c {
log.Printf("log: len(%d) cap(%d)", l, c)
}
time.Sleep(intvl)
}
}
func main() {
log.Print("main")
c := make(chan []byte, 10)
var chanMonitorInterval = 1 * time.Second
go monitorChan(c, chanMonitorInterval)
log.Print("monitor")
time.Sleep(5 * chanMonitorInterval)
for len(c) != cap(c) {
c <- []byte{}
}
log.Print("len(c) == cap(c)")
time.Sleep(3 * chanMonitorInterval)
<-c
log.Print("len(c) < cap(c)")
time.Sleep(5 * chanMonitorInterval)
log.Print("main")
}
游乐场: https: //play.golang.org/p/c5VhIIO0pik
输出:
2009/11/10 23:00:00 main
2009/11/10 23:00:00 monitor
2009/11/10 23:00:05 len(c) == cap(c)
2009/11/10 23:00:06 log: len(10) cap(10)
2009/11/10 23:00:07 log: len(10) cap(10)
2009/11/10 23:00:08 log: len(10) cap(10)
2009/11/10 23:00:08 len(c) < cap(c)
2009/11/10 23:00:13 main
参考:
推荐阅读
- google-apps-script - Google 表格将每张表格转换为 PDF,但不保留格式。我怎样才能使这项工作?
- java - 函数式编程/流练习
- structuremap - MassTransit 消费者 IContainer 有效负载未由 StructureMapConsumerScopeProvider 设置
- python - Python dynamodb ExpressionAttributeValues 包含无效键:语法错误;钥匙:
- android - onDraw 函数被调用两次?
- linux - 如何显示不重复的值
- excel - 如何清除A列以外的行内容?
- javascript - 面向对象的 Javascript 在嵌入式数组中创建格式错误的数据
- python - Apache + Django + wsgi.py。无法访问网站
- hibernate - @OrderBy 注释中的 JPA/Hibernate CASE 抛出异常:意外令牌:CASE