go的context


💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    |-----------------------------|
    | 💖The Start💖点点关注,收藏不迷路💖 |

    📒文章目录

      • [Context 的基本概念](#Context 的基本概念)
      • [创建 Context](#创建 Context)
      • [使用 Context 的技巧](#使用 Context 的技巧)
        • [1. 传递截止时间](#1. 传递截止时间)
        • [2. 处理超时](#2. 处理超时)
        • [3. 取消操作](#3. 取消操作)
        • [4. 值的传递](#4. 值的传递)
        • [5. 避免错误的取消](#5. 避免错误的取消)
        • [6. 避免使用全局 Context](#6. 避免使用全局 Context)
      • 总结

在 Go 语言的并发编程中,context 包扮演着至关重要的角色。它不仅帮助开发者在多个 goroutine 之间传递请求和响应,还提供了一种优雅的方式来取消操作、传递截止时间以及处理超时。本文将深入探讨 context 的使用技巧,旨在帮助开发者更好地理解和应用这一强大的工具。

Context 的基本概念

在 Go 语言中,context 是一个用于在 API 之间传递请求范围的值和取消信号的包。它允许程序中的多个 goroutine 以一种安全的方式协调工作。context 包的设计初衷是为了解决并发编程中的一些常见问题,比如:

  • 传递请求的截止时间。
  • 传递请求取消信号。
  • 传递请求的生命周期信息。

创建 Context

创建一个 context 非常简单,可以使用 context.Background()context.TODO() 来创建一个新的空 context。但更常见的做法是使用 WithCancel(), WithDeadline(), 或 WithTimeout() 等函数来创建一个带有特定属性的 context

go 复制代码
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

这段代码创建了一个可以被取消的 contextcancel 函数在 goroutine 结束时被调用,以确保资源被正确释放。

使用 Context 的技巧

1. 传递截止时间

使用 WithDeadline() 可以为 context 设置一个截止时间。如果操作在这个时间之前没有完成,context 将被自动取消。

go 复制代码
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
defer cancel()

// 模拟长时间运行的操作
time.Sleep(3 * time.Second)

2. 处理超时

WithTimeout()WithDeadline() 的快捷方式,它允许你直接指定一个超时时间而不是截止时间。

go 复制代码
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 操作...

3. 取消操作

在某些情况下,你可能需要在满足特定条件时取消正在进行的操作。使用 WithCancel() 可以轻松实现这一点。

go 复制代码
ctx, cancel := context.WithCancel(context.Background())

go func() {
    // 模拟长时间运行的goroutine
    time.Sleep(3 * time.Second)
    cancel()
}()

// 等待goroutine完成或取消
select {
case <-ctx.Done():
    fmt.Println("操作被取消")
case <-time.After(5 * time.Second):
    fmt.Println("超时")
}

4. 值的传递

WithValue() 允许你将请求范围的值传递给 context。这在需要在不同层级的函数之间共享数据时非常有用。

go 复制代码
ctx := context.WithValue(context.Background(), "key", "value")

// 在其他goroutine中访问值
value := ctx.Value("key").(string)

5. 避免错误的取消

在使用 context 时,一个常见的错误是忘记调用 cancel 函数。这可能导致 goroutine 泄露。确保在函数的 defer 块中调用 cancel,以避免这种情况。

6. 避免使用全局 Context

尽量避免使用全局的 context,因为它们可能会无意中被多个 goroutine 共享,导致难以追踪的错误。

总结

context 是 Go 语言中处理并发和请求生命周期的强大工具。通过合理使用 context,开发者可以编写出更加健壮、易于维护的并发代码。本文介绍了一些 context 的使用技巧,希望能够帮助开发者更深入地理解并应用这一功能。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

|---------------------------|
| 💖The End💖点点关注,收藏不迷路💖 |

相关推荐
在路上走着走着3 分钟前
openEuler安装OpenGauss5.0
数据库·gaussdb
余~~1853816280026 分钟前
矩阵碰一碰发视频源码技术解析,支持OEM
数据库·microsoft
蓝天星空37 分钟前
spring cloud gateway 3
java·spring cloud
罗政42 分钟前
PDF书籍《手写调用链监控APM系统-Java版》第9章 插件与链路的结合:Mysql插件实现
java·mysql·pdf
一根稻草君1 小时前
利用poi写一个工具类导出逐级合并的单元格的Excel(通用)
java·excel
kirito学长-Java1 小时前
springboot/ssm网上宠物店系统Java代码编写web宠物用品商城项目
java·spring boot·后端
张声录11 小时前
【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点
数据库·etcd
天乐敲代码1 小时前
Etcd静态分布式集群搭建
数据库·分布式·etcd
chengma_0909091 小时前
MySQL 数据库连接数查询、配置
数据库·mysql
木头没有瓜1 小时前
ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
android·java·okhttp