闽公网安备 35020302035485号
func After(d Duration) <-chan Time该方法可以在一定时间(根据所传入的 Duration)后主动返回 time.Time 类型的 channel 消息。在常见的场景下,我们会基于此方法做一些计时器相关的功能开发,例子如下:
func main() {
ch := make(chan string)
go func() {
time.Sleep(time.Second * 3)
ch <- "脑子进煎鱼了"
}()
select {
case _ = <-ch:
case <-time.After(time.Second * 1):
fmt.Println("堆代码出去了,超时了!!!")
}
}
在运行 1 秒钟后,输出结果:堆代码出去了,超时了!!!
上述程序在在运行 1 秒钟后将触发 time.After 方法的定时消息返回,输出了超时的结果。func main() {
ch := make(chan int, 10)
go func() {
in := 1
for {
in++
ch <- in
}
}()
for {
select {
case _ = <-ch:
// 堆代码 duidaima.com
continue
case <-time.After(3 * time.Minute):
fmt.Printf("现在是:%d,我脑子进煎鱼了!", time.Now().Unix())
}
}
}
在上述代码中,我们构造了一个 for+select+channel 的一个经典的处理模式。同时在 select+case 中调用了 time.After 方法做超时控制,避免在 channel 等待时阻塞过久,引发其他问题。看上去都没什么问题,但是细心一看。在运行了一段时间后,我的笔记本电脑已经温热了许多。

// 安装 go1.23rc2 的 go 新版本 $ go install golang.org/dl/go1.23rc2@latest $ go1.23rc2 download // 运行煎鱼前面的代码例子 $ go1.23rc2 run main.go2、项目的 go.mod 文件注意 go 版本在 1.23,否则该新特性将由于兼容性保障无法生效:

