请讲解一下golang中的context @ 胡巴 | 星期六,三月 9 日,2024 年 | 3 分钟阅读 | 更新于 星期六,三月 9 日,2024 年

在Go语言中,context包提供了一种在API边界和进程之间传递请求范围的值、取消信号和截止时间的方法。本文将详细介绍Go语言中context的使用方法和最佳实践。

context包是Go语言在1.7版本中引入的标准库,它提供了一种机制,允许在API之间和进程之间传递截止时间、取消信号和其他请求范围的值。在处理多个goroutine和请求时,context特别有用,因为它可以帮助控制何时取消或结束这些操作。

Context接口

context包的核心是Context接口,它定义了四个需要实现的方法:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}
  • Deadline方法返回一个截止时间,表示这个context应该被取消的时间。
  • Done方法返回一个通道(channel),这个通道关闭时表示context已经被取消。
  • Err方法返回一个错误,说明为什么context被取消。
  • Value方法返回context存储的键对应的值,对于传递请求范围的值非常有用。

使用Context

context包提供了几种创建和操作context的方法:

  • context.Background():返回一个空的context,通常用作所有context树的根。
  • context.WithCancel(parent Context):返回一个基于父context的新context,该context可以独立取消。
  • context.WithTimeout(parent Context, timeout time.Duration):返回一个基于父context的新context,该context在超时后会自动取消。
  • context.WithValue(parent Context, key, val interface{}):返回一个基于父context的新context,其中包含键值对。 在goroutine中使用context时,应该将context作为函数的第一个参数传递:
func doSomething(ctx context.Context, arg Arg) error {
    // 使用ctx.Done()来检查是否需要取消操作
    for {
        select {
        case <-ctx.Done():
            return ctx.Err()
        default:
            // 执行操作
        }
    }
}

最佳实践

在使用context时,应该遵循一些最佳实践:

  • 不要将context存储在结构体中,而是作为第一个参数传递。
  • 不要传递nil的context,如果你不确定使用什么context,可以使用context.Background()
  • 使用context的Value相关方法时,应该使用唯一的键,以避免键冲突。
  • 在传递context时,应该根据需要使用WithCancelWithTimeoutWithValue创建新的context。 context包是Go语言中处理并发控制和请求范围数据传递的重要工具。正确使用context可以帮助编写更清晰、更可控的并发代码。

捐赠

感谢老板请我喝杯咖啡!Thank you for buying me a coffee!

WeChat AliPay PayPal
wechatpay alipay PayPal

公众号: 无限递归

alt 搜索公众号:无限递归

Copyright © 2017 - 2024 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】

avatar
基本信息
  • 姓名:bobo
  • 花名:胡巴
  • 性别:男
  • 血型:O型
  • 星座:白羊座

联系方式

  • 所在地:上海
  • QQ:279250819
  • 微信号:wanghuiwoshinideyou
  • 电子邮件:279250819@qq.com

博客地址

公众号

alt 无限递归

工作经历
  • 2022.5 - 至今

    • 公司:乐府互娱
    • 职位:高级SDK工程师
  • 2019.6 - 2022.4

    • 公司:萌推(上海突进网络科技有限公司)
    • 职位:中级PHP工程师 & 初级golang工程师
    • 荣誉:
      • 绩效A连续得主
      • 月度之星
      • 优秀个人奖
    • 所作所为:
      • 利用ES优化OMS、MMS管理系统商品列表查询
      • 利用消息队列、Redis、乐观锁优化商品审核流程
      • 利用Redis对商家端接口进行有效限流
      • 优化商品相关表索引,提升SQL查询速度
      • 商品中台构建,统一商品相关操作
      • 大表优化(数据分离、分表、大字段拆分)
      • 掌握所有商品核心流程
  • 2018.5 - 2019.5

    • 公司:DaDa英语(上海卓赞教育信息科技有限公司)
    • 职位:中级PHP开发工程师
    • 荣誉:无
    • 所作所为:
      • 利用ES优化教师CMS系统统计数据接口至500ms内
      • 工单系统开发及持续优化
      • 教师CMS系统的功能开发及持续优化
  • 2018.3 - 2018.5

    • 公司:波奇(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:同下
    • 所做作为:如下
  • 2016.7 - 2018.3

    • 公司:光橙(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:
      • 年度最佳进步奖
    • 所作所为:
      • 利用Redis提升商详接口最佳响应速度至50ms内
      • 利用Redis提升双11活动页可承受QPS至500以上
      • 利用Redis对接口进行简单限流
      • 与小伙伴合作提升搜索质量(ES初识)
      • 其他C端接口的开发及优化
      • B端商城老页面的维护及优化
SKILLS

编程语言

  • PHP
  • Golang
  • Shell
  • JAVA
  • JS
  • HTML\CSS

数据库

  • MySQL
  • Redis
  • Clickhouse

消息中间件

  • RabbitMq
  • Kafka

文档撰写

  • Swagger
  • Markdown

技术框架

  • Laravel
  • gin

搜索引擎

  • ElasticSearch

抓包工具

  • Charles