首页 >后端开发 >Golang >为什么我的Golang超时案例在使用通道时没有触发?

为什么我的Golang超时案例在使用通道时没有触发?

Patricia Arquette
Patricia Arquette原创
2024-12-18 11:38:15818浏览

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

在带有 Channels 的 Golang 中未触发超时情况

在提供的代码中,使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn