如何将通道作为参数传递给函数?

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)


elz*_*app 5

done(&signal)被同步调用。也许你想做的是异步调用它?

为此,将关键字go放在函数调用之前

go done(&signal)
Run Code Online (Sandbox Code Playgroud)

主线程将阻塞,直到完成函数写入通道。并且 done 方法将阻止写入通道,直到主线程读取通道。