Go 戈朗的垃圾通道?

Go 戈朗的垃圾通道?,go,channel,Go,Channel,我在函数中接受一个done通道,这很适合在异步进程完成时通知调用者,如果他们关心的话。例如,这对于编写单元测试非常有用 如果我的调用者不需要此功能,是否有一种惯用的方法来传递垃圾通道,在该通道中,发送给它的所有值都会立即被丢弃?起初,我很惊讶发送nil不起作用发送到nil会阻止发送者。我可以想象一个总的实现,比如goroutine,它总是从这个渠道运行,但我很想写一些类似的东西: func myFunc(foo int, done chan bool) { .... } func ma

我在函数中接受一个done通道,这很适合在异步进程完成时通知调用者,如果他们关心的话。例如,这对于编写单元测试非常有用

如果我的调用者不需要此功能,是否有一种惯用的方法来传递垃圾通道,在该通道中,发送给它的所有值都会立即被丢弃?起初,我很惊讶发送nil不起作用发送到nil会阻止发送者。我可以想象一个总的实现,比如goroutine,它总是从这个渠道运行,但我很想写一些类似的东西:

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)
}