go语言time.After()的作用

 更新时间:2024年10月18日 10:38:18   作者:shulu  
time.After 是 Go 语言中的一个函数,用于返回一个定时器通道,该通道在指定时间后发送当前时间,这个功能常用于超时控制和延迟执行,本文就来详细的介绍一下,感兴趣的可以了解学习

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

应用场景:

1.延迟执行、定时任务

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请求时,不希望这个请求无限制地等待响应,而是想在某个超时时间后停止等待并处理超时逻辑:

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

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。

go time.After 定时器示例

package main
 
import (
	"fmt"
	"time"
)
 
// 定义 stop 函数,接受 deviceid 和 gunid 作为参数
func stop(deviceid int, gunid int) {
	fmt.Printf("Stopping with device ID: %d and gun ID: %d\n", deviceid, gunid)
}
 
func main() {
	// 设定要传递给 stop 函数的参数
	deviceid := 1
	gunid := 2
 
	// 使用 goroutine 异步执行计时器
	go func() {
		// 创建一个通道,将在 10 秒后关闭
		timer := time.After(10 * time.Second)
 
		// 等待通道关闭,即等待 10 秒
		<-timer
 
		// 在 10 秒后执行 stop 函数
		stop(deviceid, gunid)
	}()
 
	// 主程序可以继续执行其他任务
	fmt.Println("Main program continues to run...")
 
	// 为了演示,让主程序运行一段时间,以便观察 stop 函数的执行
	time.Sleep(15 * time.Second)
	fmt.Println("Main program ends.")
}

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

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

  • time.Sleep 较为简单直接。
  • time.After 返回通道(channel),读取通道时阻塞来实现。

到此这篇关于go语言time.After()的作用的文章就介绍到这了,更多相关go语言time.After()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • golang实现http服务器处理静态文件示例

    golang实现http服务器处理静态文件示例

    这篇文章主要介绍了golang实现http服务器处理静态文件的方法,涉及Go语言基于http协议处理文件的相关技巧,需要的朋友可以参考下
    2016-07-07
  • go语言基础 seek光标位置os包的使用

    go语言基础 seek光标位置os包的使用

    这篇文章主要介绍了go语言基础 seek光标位置os包的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 基于Go语言开发一个编解码工具

    基于Go语言开发一个编解码工具

    这篇文章主要为大家详细介绍了如何基于Go语言开发一个编解码工具,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2025-03-03
  • 浅析Go汇编语法和MatrixOne使用介绍

    浅析Go汇编语法和MatrixOne使用介绍

    MatrixOne由Go语言所开发是一个新一代超融合异构数据库,致力于打造单一架构处理TP、AP、流计算等多种负载的极简大数据引擎,今天通过本文给大家介绍Go汇编语法和MatrixOne使用,感兴趣的朋友一起看看吧
    2022-04-04
  • Go语言使用slices包轻松实现排序功能

    Go语言使用slices包轻松实现排序功能

    在 Go 语言开发中,对数据进行排序是常见的需求,Go 1.18 版本引入的 slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本文将通过具体示例,详细介绍如何使用 slices包实现排序及相关功能,需要的朋友可以参考下
    2025-05-05
  • go defer return panic 执行顺序示例详解

    go defer return panic 执行顺序示例详解

    这篇文章主要介绍了go defer return panic 执行顺序,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • go swagger生成接口文档使用教程

    go swagger生成接口文档使用教程

    这篇文章主要为大家介绍了go swagger生成接口文档使用教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Apache IoTDB开发系统之Go原生接口方法

    Apache IoTDB开发系统之Go原生接口方法

    这篇文章主要为大家介绍了 Apache IoTDB开发系统之Go原生接口方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • go的defer和闭包示例说明(非内部实现)

    go的defer和闭包示例说明(非内部实现)

    这篇文章主要为大家介绍了go的defer和闭包示例说明(非内部实现),有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Go语言字符串及strings和strconv包使用实例

    Go语言字符串及strings和strconv包使用实例

    字符串是工作中最常用的,值得我们专门的练习一下,下面这篇文章主要给大家介绍了关于Go语言字符串及strings和strconv包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06

最新评论