本文主要是介绍golang 中在for循环体内使用select case <-time.After定时器问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在go语言的代码中,我们经常会看到在在for循环体内使用select case <-time.After 的类似语句, 其实这个地方不管你是用 time.After(2 * time.Second) 还是 time.NewTicker(2 * time.Second) 的方式,如果放到for循环体内select case 则这个case里面的代码是不会被执行的, 因为如果放到循环体内的话,每次执行的时候他们都会被重新初始化(这还会造成内存泄露的OOM问题)
正确的使用方式应该是将他们的定义放到循环体外,然后在循环体内只是是使用其 chan变量,
如:
package mainimport ("fmt""time"
)
// time.After time.NewTicker 测试用例
// 专业企业信息化软件研发 https://dev.tekin.cn/contactus.html
func ExampleDemo1() {ch := make(chan int, 1)ch <- 123close(ch)// tChan := time.NewTicker(2 * time.Second).C // ticker.C 这个是时间的管道chantChan := time.After(3 * time.Second) // 注意这个time.After不能放到循环体内, 如果放到了循环体内,这case <-time.After():这里的内容永远不会被执行,因为每次执行到case <-time.After(): 这个time.After都会被初始化!!LOOP:for {select {case v, ok := <-ch:if !ok {break LOOP // 退出for循环}fmt.Printf("%v %v\n", v, ok)case <-tChan: // 这里只能放time.After的chan变量,不能直接放 time.Afterfmt.Println("3秒之后执行")}}//output: 123 true
}
这篇关于golang 中在for循环体内使用select case <-time.After定时器问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!