在下面的代码中,迭代运行两次。 是否可能恰好在第一次迭代和第二次迭代之间运行“ test2 <-true”? 我的意思是,在第一次迭代结束而第二次迭代未开始时,是否将true发送给“ test2”?
package main import "log" import "time" func main() { test := make(chan bool, 1) test2 := make(chan bool, 1) go func() { for { select { case <-test: log.Println("test") case <-test2: log.Println("test2") } } }() test <- true time.Sleep(1) test2 <- true time.Sleep(1) }
是。由于您的频道已缓冲,可以保存1个值。主执行流程可以继续进行,而无需您的匿名goroutine读取您发送到test通道的值,并且可以test2在goroutine唤醒并读取通道上的值之前在通道上发送值test。
test
test2
因为您有时间,所以不太可能发生这种情况。Sleep()调用通常会给goroutine执行时间,但是并没有告诉您在机器非常繁忙,电源处于停电状态的情况下会发生什么情况。不幸的时光或其他您没有想到的事情。
如果您的test通道未缓冲,则该test <- true语句将阻塞,直到您的goroutine接收到该值为止,并且在test2从该test通道接收任何内容之前,该goroutine至少没有接收的可能。
test <- true