5 go
我做了两次尝试将一个通道作为参数传递给函数,但它们都失败了(死锁):
尝试1:
func done(signal *chan bool) {
*signal <- true
}
func main() {
signal := make(chan bool)
done(&signal)
<-signal
fmt.Println("completed")
}
Run Code Online (Sandbox Code Playgroud)
尝试2:
func done(signal chan bool) {
signal <- true
}
func main() {
signal := make(chan bool)
done(signal)
<-signal
fmt.Println("completed")
}
Run Code Online (Sandbox Code Playgroud)
好吧,我没有想法.将频道传递给函数的正确方法是什么?
nos*_*nos 16
默认情况下,通道是无缓冲的,因此当您在通道上发送时,该发送将阻塞,直到有人收到该值.在你的代码中就是这种情况,在你正在做的事情上signal <- true
,没有人可以或者永远不会在同一个频道上收到.
你可以创建一个执行发送的goroutine,这样main()中的执行就会继续,并且会有人接收到这个值:
go done(signal)
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个缓冲通道,因此如果通道中的值有空间,则通道上的发送不会阻止:
signal := make(chan bool, 1)
Run Code Online (Sandbox Code Playgroud)
done(&signal)
被同步调用。也许你想做的是异步调用它?
为此,将关键字go
放在函数调用之前
go done(&signal)
Run Code Online (Sandbox Code Playgroud)
主线程将阻塞,直到完成函数写入通道。并且 done 方法将阻止写入通道,直到主线程读取通道。
归档时间: |
|
查看次数: |
4411 次 |
最近记录: |