在下面的代码中,迭代运行了两次。
是否有可能在第一次迭代和第二次迭代之间的时刻运行“test2 <- true”?
我的意思是,当第一次迭代结束而第二次迭代未开始时,是否有向“test2”发送 true 的更改?
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)
}
最佳答案
是的。由于您的 channel 已缓冲并且可以保存 1 个值。主执行流程可以继续,而无需您的匿名 goroutine 读取您发送到 test
的值。 channel ,它可以在 test2
上发送一个值在 goroutine 唤醒并读取 test
上的值之前的 channel channel 。
这不太可能发生,因为您有一个 time.Sleep() 调用,通常会为 goroutine 执行提供时间,但是不知道在您的机器非常繁忙的极端情况下会发生什么,因为在(不)幸运的时间或其他您没有想到的事情停电。
如果您的 test
channel 是无缓冲的,test <- true
语句将阻塞,直到您的 goroutine 收到该值,并且 goroutine 至少不可能从 test2
接收到该值。在从 test
收到任何东西之前 channel 。
关于go - 如果在第一次迭代和第二次迭代之间有一个小时刻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973935/