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

时间:2014-02-20 07:51:42

标签: go

我做了两次尝试将一个通道作为参数传递给一个函数,但它们都失败了(死锁):

尝试1:

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

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

尝试2:

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

func main() {
    signal := make(chan bool)
    done(signal)
    <-signal
    fmt.Println("completed")
}

好吧,我没有想法。将频道传递给函数的正确方法是什么?

2 个答案:

答案 0 :(得分:15)

默认情况下,频道是无缓冲的,因此当您发送频道时,该发送将被阻止 直到有人收到价值。在您的代码中就是这种情况,就在您正在进行的signal <- true时,没有人可以或将来会在同一频道上收到。

您可以创建一个执行发送的goroutine,这样main()中的执行就会继续,并且会有人接收到该值:

go done(signal)

或者您可以创建缓冲频道,因此如果频道中的值有空间,则在频道上发送不会阻止:

 signal := make(chan bool, 1)

答案 1 :(得分:3)

同步调用

done(&signal)。也许您想要做的是异步调用它?

这样做,将关键字go放在函数调用

之前
go done(&signal)

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