当前位置: 首页 > article >正文

关于go-context包

思维导图

  • 目的
    • 为了在不同的 goroutine 之间或跨 API 边界传递超时、取消信号和其他请求范围内的值(与该请求相关的值。这些值可能包括用户身份信息、请求处理日志、跟踪信息等等)。
  • 常用场景
    • 数据操作
    • 网络请求
    • RPC操作
  • context接口
    • context 包在提供了一个用于跨 API 边界传递超时、取消信号和其他请求范围值的通用数据结构。
    • 用于在多个 Goroutine 和函数之间传递请求范围内的信息。
    • 核心方法:Deadline、Done、Err、Value
  • 分解核心方法
    • Deadline
      • Deadline() (deadline time.Time, ok bool) 方法返回 Context 的截止时间,表示在这个时间点之后,Context 会被自动取消。
      • 如果 Context 没有设置截止时间,该方法返回一个零值 time.Time 和一个布尔值 false。
    • Done
      • Done() 方法返回一个只读通道,当 Context 被取消时,该通道会被关闭。
      • 你可以通过监听这个通道来检测 Context 是否被取消。如果 Context 永不取消,则返回 nil。
    • Err
      • Err() 方法返回一个 error 值,表示 Context 被取消时产生的错误。
      • 如果 Context 尚未取消,该方法返回 nil。
    • Value
      • Value(key any) any 方法返回与 Context 关联的键值对,一般用于在 Goroutine 之间传递请求范围内的信息。
      • 如果没有关联的值,则返回 nil。
  • context创建的方式
    • context.Background()
      • 该函数返回一个非 nil 的空 Context,它没有携带任何的值,也没有取消和超时信号。通常作为根 Context 使用。
    • context.todo()
      • context.TODO() 函数返回一个非 nil 的空 Context,它没有携带任何的值,也没有取消和超时信号。
      • 不确定上下文时使用
    • context.withvalue()
      • context.WithValue(parent Context, key, val any) 函数接收一个父 Context 和一个键值对 key、val,返回一个新的子 Context,并在其中添加一个 key-value 数据对。
    • context.Witchcancle()
      • context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) 函数接收一个父 Context,返回一个新的子 Context 和一个取消函数,当取消函数被调用时,子 Context 会被取消,同时会向子 Context 关联的 Done() 通道发送取消信号,届时其衍生的子孙 Context 都会被取消。
      • 这个函数适用于手动取消操作的场景。
    • context.withDeadline()
      • context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) 函数接收一个父 Context 和一个截止时间作为参数,返回一个新的子 Context。当截止时间到达时,子 Context 其衍生的子孙 Context 会被自动取消。
      • 这个函数适用于需要在特定时间点取消操作的场景。
    • context.withTimeout()
      • context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) 函数和 context.WithDeadline() 函数的功能是一样的,其底层会调用 WithDeadline() 函数,只不过其第二个参数接收的是一个超时时间,而不是截止时间。
      • 这个函数适用于需要在一段时间后取消操作的场景。
    • context的使用场景
      • 传递共享数据
      • 传递取消信号,结束任务
      • 超时控制

http://www.kler.cn/a/549872.html

相关文章:

  • C#控制台大小Console.SetWindowSize函数失效解决
  • elementui: el-dialog的header设置样式不生效
  • 【C++】使用gdb在命令行下调试C++程序(二)
  • Matlab自学笔记四十七:如何把日期时间型数据作为横坐标进行绘图
  • 数据结构——顺序表与链表
  • 【第1章:深度学习概览——1.3 深度学习的核心组件与概念解析之神经网络基础】
  • 麒麟v10 server版安装ollama跑Deepseek
  • React的内部机制详解
  • 【Flink快速入门-5.流处理之多流转换算子】
  • 【Python的FastAPI 与 Uvicorn】快速启动你StableDiffusion模型Web 应用
  • 相机功耗问题常用的拆解手法
  • 使用 Python 爬虫获取微店商品详情 API 接口数据
  • uniapp中实现国际化
  • 对界面简单易用封装SDK
  • QT基础二、信号和槽
  • LeetCode 热门100题-和为 K 的子数组-错题
  • 国家超算平台上线DeepSeek - R1系列模型:开启AI新征程
  • [JVM篇]虚拟机性能监控、故障处理工具
  • WEB安全--SQL注入--PDO与绕过
  • 用deepseek学大模型04-模型可视化与数据可视化