我不清楚为什么如果删除func a1
中的<-result
,func 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
的输入通道正在执行导致差异的操作。
答案 0 :(得分:1)
因为没有<-result,a2()返回并且程序终止,假设a2()是main()唯一要做的事情。可能a1()甚至都不会唤醒,因为缓冲了输入通道,并且不会阻塞对其的写入。如果将其设置为无缓冲,则a1()将在a2()返回之前唤醒,但这仍然不能保证println将运行。
使用<-result,a2()等待a1()从println之后的结果通道读取。这是确保println运行的最安全方法。