go语言time.After()的作用

time.After是一个非常实用的函数,它返回一个用于读取的单向通道(<-chan time.Time),这个通道会在指定的时间间隔之后发送当前时间。这个机制常被用于实现超时控制、延迟执行等场景。

应用场景:

1.延迟执行、定时任务

go 复制代码
package main

import (
	"fmt"
	"time"
)

func main() {
	// 等待3秒
	timer := time.After(3 * time.Second)

	// 阻塞等待time.After的通道发送时间
	x := <-timer
	fmt.Println(x)
	// 当上面的<-timer执行后,说明已经等待了5秒
	fmt.Println("3秒已过")

	// 你可以继续执行你的逻辑...
}

2.超时控制

time.After还常用于实现超时控制。比如,你可能在发送一个HTTP请求时,不希望这个请求无限制地等待响应,而是想在某个超时时间后停止等待并处理超时逻辑:

超时控制应该是非常常见的使用场景。

go 复制代码
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

func main() {
	client := &http.Client{
		Timeout: 10 * time.Second, // 设置客户端超时时间
	}

	// 模拟一个可能会超时的请求
	resp, err := client.Get("http://example.com/may-timeout")
	if err != nil {
		fmt.Println("请求错误:", err)
		return
	}
	defer resp.Body.Close()

	// 使用time.After实现读取响应体的超时
	done := make(chan bool, 1)
	go func() {
		// 模拟读取响应体,实际中可能是ioutil.ReadAll(resp.Body)
		// 这里用time.Sleep模拟耗时操作
		time.Sleep(2 * time.Second)
		done <- true
	}()

	select {
	case <-done:
		// 读取成功
		body, _ := ioutil.ReadAll(resp.Body)
		fmt.Println("读取响应体成功:", string(body))
	case <-time.After(1 * time.Second):
		// 超时
		fmt.Println("读取响应体超时")
	}
}

超时控制channel结合了select。

3.time.Sleep和time.After的差异

time.Sleep和time.After什么区别?

time.Sleep 较为简单直接。

time.After 返回通道(channel),读取通道时阻塞来实现。

相关推荐
爱勇宝1 分钟前
客户只想看个页面,我却做了一个静态演示发布系统
前端·javascript·后端
一个有理想的摸鱼选手13 分钟前
(四)路书Agnet-综合天气距离交通节奏等多因素来编排旅行路线
前端·后端·gis
神奇的程序员15 分钟前
在这个独属于ai的时代,我终究是被裁员了
前端·后端·面试
ZJU_统一阿萨姆15 分钟前
【算子开发】环境搭建与第一个CUDA程序
开发语言·人工智能·系统架构
云边有个稻草人18 分钟前
从单机工具到“云+端+服务”:KDMS数据库迁移工具如何支撑大型信创项目协同作战
后端
李广坤23 分钟前
AgentScope Tool 热更新技术方案:不重启服务,实时管控 Agent 工具
后端·架构
Evand J25 分钟前
【MATLAB例程,车联网8】MPC网联车辆节能跟驰控制:速度跟踪、间距约束与能耗优化。附MATLAB完整代码的下载链接
开发语言·matlab·车联网·调度·mpc·节能·车辆控制
ttwuai42 分钟前
Go 后台接入 SSO 后菜单正常但接口 403,怎么排查权限链路?
开发语言·后端·golang
Canmag 兴隆磁性1 小时前
C 系列充磁机
c语言·开发语言·学习·永磁材料·充磁·退磁
benchmark_cc1 小时前
批量获取量化数据时,如何设置合理的超时和重试机制?——QuantDash 高性能实战指南
开发语言·人工智能·python·pandas·量化·quantdash