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 main

import (
	"fmt"
	"time"
)
// time.After  time.NewTicker 测试用例
// 专业企业信息化软件研发 https://dev.tekin.cn/contactus.html
func ExampleDemo1() {
	ch := make(chan int, 1)
	ch <- 123
	close(ch)

	// tChan := time.NewTicker(2 * time.Second).C // ticker.C 这个是时间的管道chan
	tChan := 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.After
			fmt.Println("3秒之后执行")
		}
	}
	//output: 123 true
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值