我正在使用goroutines /频道。这是我的代码。为什么超时情况没有得到执行?
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() go func() { for { select { case i := <-c1: fmt.Println(i) case <-time.After(2000 * time.Millisecond): fmt.Println("TIMEOUT") // <-- Not Executed } } }() fmt.Scanln() }
您的超时不会发生,因为您的goroutine c1之一会每1.5秒(或大约1.5秒)重复发送一次值在您的频道上,并且只有c1在2秒钟内没有接收到任何值时才会发生超时。
c1
一旦从接收到一个值c1,在下一次迭代中将select再次执行一个 新的 time.After()调用,该调用将返回一个 新的 通道,在该通道上将仅在另外2秒钟后发送一个值。先前select执行的超时通道将被丢弃,不再使用。
select
time.After()
要在2秒后收到超时,请仅创建一次超时通道,例如:
timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") // Will get executed after 2 sec } }
输出:
10 TIMEOUT 10 10 10 ...