我对发送者通道的效果有疑问

我不清楚为什么如果我删除in ,则 in 中的 print 语句func a1将不会打印任何内容。我认为在我们将某些内容发送到结果之前,应该执行打印语句,并且不应对此产生任何影响。<-resultfunc a2<-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这个输入通道正在做一些导致差异的事情。


守候你守候我
浏览 84回答 1
1回答

一只名叫tom的猫

因为如果没有 <-result,a2() 返回并且程序终止,假设 a2() 是 main() 唯一做的事情。可能 a1() 甚至永远不会醒来,因为输入通道已缓冲,并且写入不会阻塞。如果将其设置为无缓冲,则 a1() 将在 a2() 返回之前唤醒,但这仍然不能保证 println 能够运行。使用 <-result,a2() 等待 a1() 从结果通道读取,该通道位于 println 之后。这是确保 println 运行的唯一最安全的方法。
打开App,查看更多内容
随时随地看视频慕课网APP