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💖点点关注,收藏不迷路💖 |

相关推荐
fenglllle7 分钟前
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
java·开发语言·jvm
计算机安禾7 分钟前
【c++面向对象编程】第44篇:typename与class的区别,依赖类型名与template消除歧义
java·jvm·c++
fengxin_rou12 分钟前
【MySQL 三大日志深度解析】:redo log、undo log、binlog 作用与两阶段提交原理
数据库·mysql·日志·redo log
ECT-OS-JiuHuaShan13 分钟前
存在是微分张量积,标量是参数但不可能是本质。还原论泛化,是语义劫持和以偏概全的逻辑谋杀伪科学庞氏骗局
数据库·人工智能·算法·机器学习·数学建模
JAVA面经实录91716 分钟前
Java+SpringAI企业级实战项目完整官方文档(生产终版)
java·开发语言·spring·ai编程
梵得儿SHI16 分钟前
Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别
java·开发语言·高并发·nio·channel·buffer·提升io效率
IT策士17 分钟前
Django 从 0 到 1 打造完整电商平台:使用 Django 消息框架与用户权限初步
数据库·django·sqlite
2301_7890156221 分钟前
C++_string增删查改模拟实现
java·开发语言·c++
没有逆称22 分钟前
Java OOM 问题全解析
java·jvm
星河耀银海23 分钟前
JAVA 注解(Annotation):从原理到实战应用
java·开发语言·数据库