Go 戈朗的垃圾通道?
我在函数中接受一个done通道,这很适合在异步进程完成时通知调用者,如果他们关心的话。例如,这对于编写单元测试非常有用 如果我的调用者不需要此功能,是否有一种惯用的方法来传递垃圾通道,在该通道中,发送给它的所有值都会立即被丢弃?起初,我很惊讶发送nil不起作用发送到nil会阻止发送者。我可以想象一个总的实现,比如goroutine,它总是从这个渠道运行,但我很想写一些类似的东西:Go 戈朗的垃圾通道?,go,channel,Go,Channel,我在函数中接受一个done通道,这很适合在异步进程完成时通知调用者,如果他们关心的话。例如,这对于编写单元测试非常有用 如果我的调用者不需要此功能,是否有一种惯用的方法来传递垃圾通道,在该通道中,发送给它的所有值都会立即被丢弃?起初,我很惊讶发送nil不起作用发送到nil会阻止发送者。我可以想象一个总的实现,比如goroutine,它总是从这个渠道运行,但我很想写一些类似的东西: func myFunc(foo int, done chan bool) { .... } func ma
func myFunc(foo int, done chan bool) {
....
}
func main() {
myfunc(4, _)
}
有没有一种简单的方法可以实现这一点?您可以在发送时使用select来避免阻塞:
select {
case done <- true:
default:
}
编辑2:您甚至可以将其设置为可变的,这允许省略完成的通道,或者提供多个通道
func myFunc(foo int, done ...chan<- struct{}) {
for _, d := range done {
if d != nil {
defer close(d)
}
}
....
}
----
myFunc(1)
myFunc(2, ch1)
myFunc(3, ch2, ch3, ch4)
这个怎么样:
func DoAllTheThings(done ...chan<- bool) {
// do the things
// all done!
if len(done) >= 1 {
done[0] <- true
}
return
}
或
为什么不检查nil并用一个伪值替换它?@JimB是你的伪值make chan bool,x,其中x是我要写入它的次数?我是否可以避免分配内存/GC以避免以后写在那里的东西丢失?用于信号的通道通常只关闭一次。如果这些值确实有用,那么是的,您需要使用它们或缓冲它们。如果这些值只是sentinel,那么应该使用sync.waitgroups。值得注意的是,提供一个名为done的通道也很常见,该通道仅在信号完成时关闭。使用done通道返回值对于大多数Go程序员来说是出乎意料的。
func DoAllTheThings(done ...chan<- bool) {
// do the things
// all done!
if len(done) >= 1 {
done[0] <- true
}
return
}
func main() {
DoAllTheThings()
}
func main() {
ch := make(chan bool)
go func() {
done := <- ch
if done {
fmt.Println("Yay!")
}
}()
DoAllTheThings(ch)
}