技能 go-concurrency-patterns
📦

go-concurrency-patterns

安全

掌握 Go 并发模式

也可从以下获取: wshobson

自信地构建并发 Go 应用程序。学习生产环境就绪的 goroutine、通道、 worker pool 和优雅关闭模式,避免竞态条件和资源泄漏。

支持: Claude Codex Code(CC)
🥉 75 青铜
1

下载技能 ZIP

2

在 Claude 中上传

前往 设置 → 功能 → 技能 → 上传技能

3

开启并开始使用

测试它

正在使用“go-concurrency-patterns”。 创建一个有 3 个 worker 的 worker pool,从通道处理任务

预期结果:

这是一个使用 3 个 worker 的 worker pool 实现,它并发处理任务并通过结果通道收集结果,使用 sync.WaitGroup 进行正确的同步。

正在使用“go-concurrency-patterns”。 展示如何使用 errgroup 进行并发 HTTP 请求

预期结果:

此示例演示了 golang.org/x/sync/errgroup 用于并发获取多个 URL,其中第一个错误通过上下文传播取消所有待处理的请求。

正在使用“go-concurrency-patterns”。 实现信号量来限制并发操作

预期结果:

我提供两种信号量方法:使用 golang.org/x/sync/semaphore.Weighted 实现加权信号量,以及使用基于通道的 struct{} 信号量实现简单的速率限制。

安全审计

安全
v1 • 2/25/2026

All 44 static analysis findings are false positives from markdown-enclosed Go code examples. The skill contains legitimate educational content about Go concurrency patterns with no executable code or security risks.

2
已扫描文件
691
分析行数
0
发现项
1
审计总数
未发现安全问题
审计者: claude

质量评分

38
架构
100
可维护性
87
内容
50
社区
100
安全
100
规范符合性

你能构建什么

构建并发微服务

创建可扩展的 Go 服务,使用 worker pool 同时处理多个请求,同时高效管理资源

实现数据处理流水线

设计扇出/扇入流水线,以正确的错误处理和取消机制并行处理大型数据集

调试竞态条件

使用正确的同步模式和竞态检测工具识别并修复现有 Go 代码中的并发错误

试试这些提示

创建基础 worker pool
教我如何在 Go 中创建一个 worker pool,使用 5 个并发 worker 处理 100 个任务
实现优雅关闭
编写一个支持优雅关闭的 Go 服务器,处理 SIGTERM 信号并等待处理中的请求完成
构建扇出流水线
在 Go 中创建一个扇出/扇入流水线,每个阶段使用 5 个 worker 处理 3 个阶段的项目
修复 goroutine 泄漏
审查这段 Go 代码,识别潜在的 goroutine 泄漏,然后展示如何使用上下文取消来修复它们

最佳实践

  • 始终使用 context.Context 进行并发操作中的取消和截止时间
  • 仅从发送方关闭通道,以避免 panic
  • 优先使用通道而不是互斥锁进行 goroutine 之间的通信
  • 使用 sync.WaitGroup 或 errgroup 等待 goroutine 完成

避免

  • 使用 time.Sleep 进行同步,而不是使用通道或 WaitGroup 等正确的原语
  • 从接收方关闭通道,这会导致 panic
  • 忘记检查 ctx.Done(),导致 goroutine 泄漏
  • 在 goroutine 之间共享内存而没有正确的同步

常见问题

Go 中并发编程和并行编程的区别是什么?
并发是指将程序结构化以同时处理多个任务,而并行是指在同一时间在多个 CPU 核心上执行多个任务。Go 的 goroutine 实现了并发设计,Go 运行时可以并行执行它们。
何时应该使用通道 versus 互斥锁?
当 goroutine 需要通信或协调时使用通道(通过通信共享内存)。当需要保护共享状态免受并发访问时使用互斥锁(通过共享内存)。在 Go 中通道通常更惯用。
如何防止 goroutine 泄漏?
始终为 goroutine 提供退出路径:使用上下文取消、在循环中检查 ctx.Done()、确保通道最终关闭,并使用 errgroup 等自动处理清理的模式。
sync.WaitGroup 的用途是什么?
sync.WaitGroup 允许你等待一组 goroutine 完成。使用 Add() 增加计数器,goroutine 完成时使用 Done() 递减,阻塞使用 Wait() 直到计数器为零。
如何检测 Go 代码中的竞态条件?
使用竞态检测器运行测试或二进制文件:'go test -race ./...' 或 'go run -race main.go'。竞态检测器监控内存访问,并报告对共享内存的并发读写(没有同步)。
有缓冲通道和无缓冲通道有什么区别?
无缓冲通道(make(chan T))要求发送方和接收方同时准备,提供同步。有缓冲通道(make(chan T, n))可存储最多 n 个值而无需接收方,允许发送方继续进行直到缓冲区满。