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

相关推荐
Eiceblue1 分钟前
Python读取PDF:文本、图片与文档属性
数据库·python·pdf
面朝大海,春不暖,花不开9 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y9 分钟前
Java安全点safepoint
java
夜晚回家44 分钟前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长1 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
stein_java3 小时前
springMVC-10验证及国际化
java·spring