在提供的代码中,使用 select 语句和 time.After() 调用实现超时情况。但是,超时情况没有被执行。
原因是 time.After() 函数每次调用时都会创建一个新通道。当 select 语句从 c1 通道接收到值时(在第一个 for 循环中),现有的 time.After() 通道将被丢弃。因此,超时情况永远没有机会接收值。
要解决此问题,只需在 for 循环之外仅创建一次 time.After() 通道。这样可以确保在整个执行过程中超时案例使用相同的通道。
修改后的代码如下:
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
通过此修改,超时案例将在 2 秒后成功执行,只要在该时间范围内没有从 c1 通道接收到任何值。
以上是为什么我的Golang超时案例在使用通道时没有触发?的详细内容。更多信息请关注PHP中文网其他相关文章!