为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守候你守候我 2023-07-10 17:56:10
我不清楚为什么如果我删除in ,则 in 中的 print 语句func a1将不会打印任何内容。我认为在我们将某些内容发送到结果之前,应该执行打印语句,并且不应对此产生任何影响。<-resultfunc a2<-resultfunc 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 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信