我对发送者频道的影响有疑问

时间:2019-08-15 04:06:09

标签: go

我不清楚为什么如果删除func a1中的<-resultfunc a2中的print语句为什么不打印任何内容。 我认为在将结果发送到结果之前,应该先执行print语句,<-result应该对此没有任何影响。

func a2(){
    x := 3
    result := make(chan int, 10)
    input := make(chan int, 10)
    go a1(x, input, result)
    input <- 4
    <-result
}

func a1(x int, input <-chan int, result chan<- int){
    y := <-input
    fmt.Println("hello", y)
    result <- x
}

但是,然后我尝试了以下代码:无论我是否有hello,它都会打印<-result

func a2(){
    x := 3
    result := make(chan int, 10)
    go a1(x, result)
    <-result
}

func a1(x int, result chan<- int){
    fmt.Println("hello")
    result <- x
}

您可以详细解释一下,以便初学者可以理解吗?似乎input <-chan int的输入通道正在执行导致差异的操作。

1 个答案:

答案 0 :(得分:1)

因为没有<-result,a2()返回并且程序终止,假设a2()是main()唯一要做的事情。可能a1()甚至都不会唤醒,因为缓冲了输入通道,并且不会阻塞对其的写入。如果将其设置为无缓冲,则a1()将在a2()返回之前唤醒,但这仍然不能保证println将运行。

使用<-result,a2()等待a1()从println之后的结果通道读取。这是确保println运行的最安全方法。