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 打印error的堆栈信息操作

    golang 打印error的堆栈信息操作

    这篇文章主要介绍了golang 打印error的堆栈信息操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 浅谈golang并发操作变量安全的问题

    浅谈golang并发操作变量安全的问题

    这篇文章主要介绍了浅谈golang并发操作变量安全的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • go语言中的interface使用实例

    go语言中的interface使用实例

    这篇文章主要介绍了go语言中的interface使用实例,go语言中的interface是一组未实现的方法的集合,如果某个对象实现了接口中的所有方法,那么此对象就实现了此接口,需要的朋友可以参考下
    2015-05-05
  • Go实践反向代理ReverseProxy解析

    Go实践反向代理ReverseProxy解析

    这篇文章主要为大家介绍了Go实践反向代理示例ReverseProxy解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Go之接口型函数用法

    Go之接口型函数用法

    这篇文章主要介绍了Go之接口型函数用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • go实现整型的二进制转化的方法

    go实现整型的二进制转化的方法

    这篇文章主要介绍了go实现整型的二进制转化的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • Go语言的方法接受者类型用值类型还是指针类型?

    Go语言的方法接受者类型用值类型还是指针类型?

    这篇文章主要介绍了Go语言的方法接受者类型用值类型还是指针类型?本文还同时讲解了关于接受者的命名方式,需要的朋友可以参考下
    2014-10-10
  • golang双指针快速排序的实现代码

    golang双指针快速排序的实现代码

    这篇文章主要介绍了golang双指针快速排序的实现代码,通过实例代码补充介绍了Golang实现快速排序和归并排序以及堆排序算法全注释,需要的朋友可以参考下
    2024-03-03
  • Golang通脉之方法详情

    Golang通脉之方法详情

    这篇文章主要介绍了Golang通脉方法,Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于,其他语言中的this或者 self,具体内容请和小编一起来学习下面文章内容吧
    2021-10-10
  • golang程序进度条实现示例详解

    golang程序进度条实现示例详解

    这篇文章主要为大家介绍了golang程序实现进度条示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论