登录
首页 >  Golang >  Go问答

为什么 time.After 在处理超时时没有生效

来源:stackoverflow

时间:2024-03-07 16:09:18 347浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《为什么 time.After 在处理超时时没有生效》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

go代码如下所示,我尝试通过go例程打印“结果”。为什么“超时”不是在3秒后打印,而是在10秒后打印。因为所有10个“结果”都打印。

package main
import "fmt"
import "time"


func main() {
  ch := make(chan string)
  go func() {
    for i:=0;i<10;i++ {
      time.Sleep(time.Second * 1)
      ch <- "result"
    }
      
  }()
  for {
    select {
    case res := <-ch:
        fmt.Println(res)
    case <-time.After(time.Second * 3):
        fmt.Println("timeout")
        return
    }
  }
}
/**
result
result
result
result
result
result
result
result
result
result
timeout
*/

正确答案


在每个 for 循环中,在 case res := <-ch 之后,创建一个新通道 <-time.after(time.second * 3)。

这个修复可能是你想要的:

timeoutChan := time.After(time.Second * 3)
    for {
        select {
        case res := <-ch:
            fmt.Println(res)
        case <-timeoutChan:
            fmt.Println("timeout")
            return
        }
    }

今天关于《为什么 time.After 在处理超时时没有生效》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>