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

Go 如何将通道作为参数传递给函数?,go,Go,我曾两次尝试将通道作为参数传递给函数,但都失败(死锁): 尝试1: func done(signal *chan bool) { *signal <- true } func main() { signal := make(chan bool) done(&signal) <-signal fmt.Println("completed") } func完成(信号*chan bool){ *信号默认情况下,通道是无缓冲的,因此当您在通

我曾两次尝试将通道作为参数传递给函数,但都失败(死锁):

尝试1:

func done(signal *chan bool) {
    *signal <- true
}

func main() {
    signal := make(chan bool)
    done(&signal)
    <-signal
    fmt.Println("completed")
}
func完成(信号*chan bool){

*信号默认情况下,通道是无缓冲的,因此当您在通道上发送时,该发送将被阻止 直到有人收到该值。这里的代码显然就是这种情况,此时您正在执行的
signal
done(&signal)
被同步调用。也许您想做的是异步调用它

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

go done(&signal)
主线程将阻塞,直到done函数写入通道。done方法将在写入通道时阻塞,直到主线程读取通道。

在您的情况下(以及几乎所有情况下)没有理由传递指向chan、map、slice或函数值的指针,因为这些都是内部包含指针的引用类型。如果您希望被调用方更改引用类型头,而不是它引用的数据,则会出现例外情况,这里的情况并非如此。
go done(signal)
 signal := make(chan bool, 1)
go done(&signal)