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

go~context的Value的建议写法

context.Context 是 Go 标准库中用于在不同的函数调用和 goroutine 之间传递请求数据、取消信号以及截止时间等信息的机制。通过 context.WithValue 函数,可以将键值对存储在 Context 中,然后在后续的函数调用中通过 Context.Value 方法来获取这些值。

在 Go 语言里,为了利用 context.Context 来安全地传递和存储特定类型的数据,同时避免键冲突,必须要使用自定义类型作为键

避免键冲突

在多个包或者不同的代码模块中,可能会使用 context.WithValue 来存储不同的数据。如果使用基本数据类型(如 string)作为键,很容易出现键冲突的问题。例如,不同的包可能都使用 “sendType” 作为键来存储不同的数据,这样就会导致数据覆盖或者混乱。

而自定义一个空结构体类型 sendTypeKey 作为键,由于每个自定义类型在 Go 中都是唯一的,所以可以确保键的唯一性,避免了键冲突的问题。

类型安全

使用自定义类型作为键,在获取值时可以进行类型断言,确保获取到的数据类型是正确的

建议写法

type sendType string

func (m sendType) String() string {
	return string(m)
}

const (
	normalSend sendType = "normal"
	batchSend  sendType = "batch"
	asyncSend  sendType = "async"
)


type sendTypeKey struct{}

func newContextWithSendType(ctx context.Context, t sendType) context.Context {
	return context.WithValue(ctx, sendTypeKey{}, t)
}

func sendTypeFromContext(ctx context.Context) (sendType, bool) {
	t, ok := ctx.Value(sendTypeKey{}).(sendType)
	return t, ok
}

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

相关文章:

  • PyTorch 系列教程:使用CNN实现图像分类
  • 设计模式使用Java案例
  • 易语言模拟真人鼠标轨迹算法
  • unity基础——Animator动画状态机
  • 山东大学计算机科学与技术学院软件工程实验日志(更新中)
  • HTML 字符集
  • 制造企业如何规划适合自身需求的PLM系统?
  • Linux中安装maven
  • ubuntu20 安装、配置Gitlab
  • 在Pycharm配置conda虚拟环境的Python解释器
  • ONNX:统一深度学习工作流的关键枢纽
  • django自动添加接口文档
  • Blender选择循环边/循环面技巧
  • 需求分析、定义、验证、变更、跟踪(高软47)
  • 第十六届蓝桥杯康复训练--1
  • Java实体类转JSON时如何避免null值变成“null“?
  • 现成的管理系统页面,直接可以使用,粘贴就行
  • Selenium Manager和webdriver manager的区别与联系
  • 【数学建模】一致矩阵的应用及其在层次分析法(AHP)中的性质
  • Gartner发布量子网络安全策略指南:2030年量子计算将能够破坏传统的加密算法