闲社服务运行正常AI智能体自动化平台
g

Go上下文

技能标识:golang-context

Idiomatic context.Context usage in Golang — creation, propagation, cancellation, timeouts, deadlines, context values, and cross-service tracing. Apply when working with context.Context in any Go code.

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 1.1.1
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

Go上下文

技能名称: golang-context
详细描述:

社区默认。 一个明确取代 samber/cc-skills-golang@golang-context 技能的公司技能优先。

Go context.Context 最佳实践

context.Context 是Go语言用于在API边界和goroutine之间传播取消信号、截止时间和请求范围值的机制。可以将其视为请求的会话——它将属于同一工作单元的所有操作联系在一起。

最佳实践总结

  1. 1. 同一个context必须在整个请求生命周期中传播:HTTP处理器 → 服务层 → 数据库 → 外部API
  2. ctx必须是第一个参数,命名为ctx context.Context
  3. 永远不要将context存储在结构体中——通过函数参数显式传递
  4. 永远不要传递nil context——如果不确定,使用context.TODO()
  5. cancel()必须在WithCancel/WithTimeout/WithDeadline之后立即延迟执行
  6. context.Background()只能在顶层使用(main、init、测试)
  7. 使用context.TODO() 作为占位符,当你知道需要context但还没有时
  8. 永远不要在请求路径中间创建新的context.Background()
  9. Context值的键必须是未导出的类型,以防止冲突
  10. Context值只能携带请求范围的元数据——永远不要用作函数参数
  11. 使用context.WithoutCancel(Go 1.21+)在生成必须比父请求存活更久的后台工作时

创建Context

场景使用
入口点(main、init、测试)context.Background()
函数需要context但调用者尚未提供
context.TODO() | | 在HTTP处理器内部 | r.Context() | | 需要取消控制 | context.WithCancel(parentCtx) | | 需要截止时间/超时 | context.WithTimeout(parentCtx, duration) |

Context传播:核心原则

最重要的规则:在整个调用链中传播同一个context。当正确传播时,取消父context会自动取消所有下游工作。

go
// ✗ 错误——创建新context,打破链
func (s *OrderService) Create(ctx context.Context, order Order) error {
return s.db.ExecContext(context.Background(), INSERT INTO orders ..., order.ID)
}

// ✓ 正确——传播调用者的context
func (s *OrderService) Create(ctx context.Context, order Order) error {
return s.db.ExecContext(ctx, INSERT INTO orders ..., order.ID)
}

深入探讨

  • - 取消、超时和截止时间 — 取消如何传播:WithCancel用于手动取消,WithTimeout用于在持续时间后自动取消,WithDeadline用于绝对时间截止。并发代码中监听(<-ctx.Done())的模式,AfterFunc回调,以及用于必须比父请求存活更久的操作(例如审计日志)的WithoutCancel。
  • - Context值和跨服务追踪 — 安全的context值模式:未导出的键类型以防止命名空间冲突,何时使用context值(请求ID、用户ID)与函数参数。追踪上下文传播:OpenTelemetry追踪头、用于日志聚合的关联ID,以及跨服务边界的context序列化/反序列化。
  • - HTTP服务器和服务调用中的Context — HTTP处理器context:r.Context()用于请求范围的取消、中间件集成以及传播到服务。HTTP客户端模式:NewRequestWithContext、客户端超时和带有上下文感知的重试。数据库操作:始终使用*Context变体(QueryContext、ExecContext)以遵守截止时间。

交叉引用

  • - → 参见samber/cc-skills-golang@golang-concurrency技能,了解使用context的goroutine取消模式
  • → 参见samber/cc-skills-golang@golang-database技能,了解上下文感知的数据库操作(QueryContext、ExecContext)
  • → 参见samber/cc-skills-golang@golang-observability技能,了解使用OpenTelemetry的追踪上下文传播
  • → 参见samber/cc-skills-golang@golang-design-patterns技能,了解超时和弹性模式

使用Linter强制执行

许多context陷阱可以通过linter自动捕获:govet、staticcheck。→ 参见samber/cc-skills-golang@golang-linter技能,了解配置和使用方法。

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 golang-context-1776093722 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 golang-context-1776093722 技能

通过命令行安装

skillhub install golang-context-1776093722

下载

⬇ 下载 golang-context v1.1.1(免费)

文件大小: 11.56 KB | 发布时间: 2026-4-14 11:19

v1.1.1 最新 2026-4-14 11:19
- Bumped skill version to 1.1.1 in metadata.
- No changes to guidelines, usage, or functionality—documentation only.
返回顶部