【发布时间】:2017-04-29 02:31:34
【问题描述】:
我在我的函数中接受done 频道,这对于在某些异步进程完成时通知调用者来说非常有用,如果他们关心的话。例如,这对于编写单元测试非常有用。
如果我的调用者不需要此功能,是否有一种惯用的方式来传递垃圾通道,发送给它的所有值都会立即被丢弃?我最初很惊讶发送nil 不起作用(发送到 nil 会阻止发件人)。我可以想到一个粗略的实现(比如一个始终运行的 goroutine,它从这个频道消费),但我很想写这样的东西:
func myFunc(foo int, done chan bool) {
....
}
func main() {
myfunc(4, _)
}
有没有一种简单的方法可以做到这一点?
【问题讨论】:
-
为什么不检查
nil并将其替换为虚拟值? -
@JimB 你的虚拟值是
make (chan bool, x),x 是我要写的次数吗?我可以避免分配内存/GC-ing 我以后写在那里的东西吗? -
用于信号的通道通常只关闭一次。如果这些值真的有用,那么是的,您要么需要使用它们,要么需要缓冲它们。如果这些值只是哨兵,您应该使用
sync.WaitGroup -
可能值得注意的是,提供一个名为“done”的通道也很常见,该通道仅对信号完成关闭。大多数 Go 程序员都不会使用“完成”通道返回值。