【发布时间】:2018-12-16 06:58:12
【问题描述】:
有几个channel可以监控,它们的类型不同且不相关(因为我们只关心len和cap),但是golang编译器不接受以下代码,无论T是什么:
func monitorChan(ch chan T) {
for {
if len(ch) == cap(ch) {
log.Warn("log")
}
time.Sleep(chanMonitorInterval)
}
}
显示错误:
不能在参数中使用 ch (type chan []byte) 作为 type chan interface {} 监控Chan。
这个函数如何修改为每个通道都写一次监控?
这是我的代码:
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 ...
}
【问题讨论】:
-
请在您调用函数的位置发布您的代码,并使用适当的参数及其类型重新创建您面临的错误
-
环绕
chan interface{}确实有效,但我希望通道在源代码中具有显式类型,最好在不进行类型转换的情况下使用消息 -
这段代码的动机是什么?如果您尝试写入一个完整的通道,Go 将自动阻止这个 goroutine,恢复另一个,并在可能完成写入时恢复这个 goroutine。您不需要采取任何手动操作来“在您等待时允许另一个线程运行”,这就是这段代码对我的感觉。