广告位联系
返回顶部
分享到

go语言time.After()的作用介绍

Golang 来源:互联网 作者:佚名 发布时间:2024-10-18 22:40:08 人浏览
摘要

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

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

应用场景:

1.延迟执行、定时任务

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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 定时器示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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),读取通道时阻塞来实现。

版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • golang并发编程使用Select语句的实现介绍
    在 Go 语言中,select语句是一种控制结构,允许一个 Goroutine 同时等待多个通道操作。select语句会阻塞,直到其中的一个case可以继续执行,然
  • go语言time.After()的作用介绍
    time.After是一个非常实用的函数,它返回一个用于读取的单向通道(-chan time.Time),这个通道会在指定的时间间隔之后发送当前时间。这个机
  • go实现一个内存缓存系统的代码
    面试内容: 支持设定过期时间,精度到秒 支持设定最大内存,当内存超出时做出合适的处理 支持并发安全 要求按照以下接口实现 1 2 3 4
  • Golang Map简介以及底层原理介绍
    在Go语言中提供了map数据结构来存储键值对数据。map的数据类型为map[K]V,其中K为键的类型,V为值的类型。map的键类型必须支持==操作符,用
  • Go语言中的switch高级用法介绍
    最近翻开源代码的时候看到了一种很有意思的switch用法,分享一下。 注意这里讨论的不是typed switch,也就是case语句后面是类型的那种。 直
  • Go语言sync.Map介绍及使用场景
    在 Go 语言中,sync.Map是一个并发安全的映射结构,专门用于在高并发场景下处理键值对数据。它的并发安全是通过内部实现机制来保证的,
  • 怎么使用工具自动监测SSL证书有效期并发送提醒
    自从云厂商的免费ssl证书改成3个月,而且证书数量还是20个之后,自己网站的ssl证书就换成了其它免费方案。但是免费方案不会提醒证书过
  • Go语言字符串处理库strings包介绍

    Go语言字符串处理库strings包介绍
    Golang字符串处理库strings 在Go语言中,strings包是一个非常重要且功能丰富的标准库,它提供了一系列用于操作字符串的函数。从基本的字符串
  • Go语言中的指针的使用介绍
    1、Go 语言中指针的介绍 1.1、什么是指针? 指针是一种变量,它存储了另一个变量的内存地址。在 Go 中,你可以通过取地址操作符获取变量
  • Go环境变量配置,及GOROOT、GOPATH的区别

    Go环境变量配置,及GOROOT、GOPATH的区别
    一、安装Go go下载地址: https://golang.google.cn/dl/ windows下载安装,有两种方式。解压和直接安装 方式一:直接下载安装包。以.msi结尾的文件。
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计