gpt4 book ai didi

go - Golang 中的垃圾 channel ?

转载 作者:IT王子 更新时间:2023-10-29 01:35:44 26 4
gpt4 key购买 nike

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

如果我的调用者不需要这个功能,是否有一种惯用的方法来传递垃圾 channel ,所有发送到它的值都会被立即丢弃?最初我很惊讶发送 nil 不起作用(发送到 nil 会阻止发件人)。我可以想到一个粗略的实现(比如一个始终运行的 goroutine,它从这个 channel 消费),但我很想写这样的东西:

func myFunc(foo int, done chan bool) {
....
}

func main() {
myfunc(4, _)
}

有没有简单的方法可以做到这一点?

最佳答案

您可以在发送时使用选择以避免阻塞:

select {
case done <- true:
default:
}

另一种选择,也是我的首选,是不通过已完成的 channel 发送内容。相反,关闭 channel 。这会导致所有被阻塞的接收操作立即返回,同时全部返回(而不是必须向每个操作发送一个值),并且防止在没有任何监听的情况下阻塞发送退出信号的函数。这也让您可以用 chan struct{} 替换 channel ,这很好,因为 struct{} 的大小为 0。

不过,值得注意的是关闭一个 nil channel ,而不是阻塞, panic ,所以你仍然需要对其进行 nil 检查。

编辑:我喜欢的风格:

func myFunc(foo int, done chan<- struct{}) {
if done != nil {
defer close(done)
}
....
}

编辑 2:您甚至可以将其设为可变参数,这样可以省略 done channel ,提供多个 channel 。

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)

关于go - Golang 中的垃圾 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41131115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com