golang-concurrency
Goの並行処理パターンに関するスキルです。goroutine、channel、select、ロック、sync primitives、errgroup、singleflight、ワーカープール、fan-out/fan-inパイプラインを含む並行Goコードの実装・レビュー時に使用します。goroutineリーク、レースコンディション、channelのオーナーシップ問題の検出や、channelとmutexの使い分けを判断する際にも適用されます。
description の原文を見る
Golang concurrency patterns. Use when writing or reviewing concurrent Go code involving goroutines, channels, select, locks, sync primitives, errgroup, singleflight, worker pools, or fan-out/fan-in pipelines. Also triggers when you detect goroutine leaks, race conditions, channel ownership issues, or need to choose between channels and mutexes.
SKILL.md 本文
ペルソナ: あなたは Go 並行処理エンジニアです。すべてのゴルーチンを必要性が証明されるまでは負債と見なします — 正確性とメモリリーク防止がパフォーマンスより優先されます。
モード:
- 書き込みモード — 並行処理コード(ゴルーチン、チャネル、同期プリミティブ、ワーカープール、パイプライン)を実装します。以下の順序指示に従ってください。
- レビューモード — PR の並行処理コード変更をレビューしています。diff に焦点を当て、ゴルーチンリーク、コンテキスト伝播の欠落、所有権違反、保護されていない共有状態を確認してください。順序的に。
- 監査モード — コードベース全体の既存の並行処理コードを監査しています。「並行処理監査の並列化」セクションで説明されているように、最大 5 つの並列サブエージェントを使用します。
コミュニティデフォルト。
samber/cc-skills-golang@golang-concurrencyスキルを明示的に上書きする会社スキルが優先されます。
Go 並行処理のベストプラクティス
Go の並行処理モデルはゴルーチンとチャネルに基づいています。ゴルーチンは安価ですが無料ではありません — スポーンするすべてのゴルーチンは管理する必要があるリソースです。目標は構造化された並行処理です。すべてのゴルーチンは明確な所有者、予測可能な終了、適切なエラー伝播を持っています。
コア原則
- すべてのゴルーチンは明確な終了を持つ必要がある — シャットダウンメカニズム(context、done チャネル、WaitGroup)がないと、リークが発生し、プロセスがクラッシュするまで蓄積されます
- メモリの共有は通信によって — チャネルは明示的に所有権を転送します。ミューテックスは共有状態を保護しますが、所有権は暗黙的です
- チャネルの送信前にコピーを送信、ポインタは送信しない — ポインタの送信は見えない共有メモリを作成し、チャネルの目的を無視します
- チャネルを閉じるのは送信側のみ — 受信側から閉じるとパニックになります(送信側が閉じた後に書き込む場合)
- チャネル方向を指定する (
chan<-,<-chan) — コンパイラはビルド時に誤用を防ぎます - デフォルトはバッファなしチャネル — 大きなバッファはバックプレッシャーをマスクします。測定されたジャスティフィケーションがある場合のみ使用してください
- select に常に
ctx.Done()を含める — なければ、呼び出し元がキャンセルされた後にゴルーチンがリークします - ループで
time.Afterを使用しない — 各呼び出しはタイマーを作成し、発火まで存在し、メモリが蓄積されます。time.NewTimer+Resetを使用してください - テストで
go.uber.org/goleakを使用してゴルーチンリークを追跡してください
詳細なチャネル/select コード例については、Channels and Select Patterns を参照してください。
チャネル vs ミューテックス vs アトミック
| シナリオ | 使用 | 理由 |
|---|---|---|
| ゴルーチン間でのデータ転送 | Channel | 所有権転送を通信 |
| ゴルーチンのライフサイクル調整 | Channel + context | select による明確なシャットダウン |
| 共有構造体フィールドの保護 | sync.Mutex / sync.RWMutex | シンプルなクリティカルセクション |
| シンプルなカウンター、フラグ | sync/atomic | ロックフリー、低オーバーヘッド |
| マップの多くの読み取り、少数の書き込み | sync.Map | 読み取り集約的なワークロード向けに最適化。マップの同時読み取り/書き込みはハードクラッシュを引き起こす |
| 高コストな計算のキャッシング | sync.Once / singleflight | 一度実行またはデデュプリケーション |
WaitGroup vs errgroup
| 必要性 | 使用 | 理由 |
|---|---|---|
| ゴルーチンを待つ、エラーは不要 | sync.WaitGroup | ファイアアンドフォーゲット |
| 待機 + 最初のエラーを収集 | errgroup.Group | エラー伝播 |
| 待機 + 最初のエラーで兄弟プロセスをキャンセル | errgroup.WithContext | エラー時のコンテキストキャンセル |
| 待機 + 並行処理を制限 | errgroup.SetLimit(n) | 組み込みワーカープール |
同期プリミティブクイックリファレンス
| プリミティブ | ユースケース | 重要な注記 |
|---|---|---|
sync.Mutex | 共有状態の保護 | クリティカルセクションを短く保つ。I/O をまたいで保持しない |
sync.RWMutex | 多くの読み取り、少数の書き込み | RLock を Lock にアップグレードしない(デッドロック) |
sync/atomic | シンプルなカウンター、フラグ | 型付きアトミックスを選択(Go 1.19+): atomic.Int64, atomic.Bool |
sync.Map | 並行マップ、読み取り集約的 | 明示的なロックなし。書き込みが多い場合は RWMutex+map を使用 |
sync.Pool | 一時的なオブジェクトの再利用 | Put() 前に常に Reset() してください。GC 圧力を削減 |
sync.Once | 一度限りの初期化 | Go 1.21+: OnceFunc, OnceValue, OnceValues |
sync.WaitGroup | ゴルーチン完了を待つ | Add を go 前に実行。Go 1.24+: wg.Go() で使用を簡素化 |
x/sync/singleflight | 同時呼び出しのデデュプリケーション | キャッシュスタンピード防止 |
x/sync/errgroup | ゴルーチングループ + エラー | SetLimit(n) は手ロール型ワーカープールを置換 |
詳細な例とアンチパターンについては、Sync Primitives Deep Dive を参照してください。
並行処理チェックリスト
ゴルーチンをスポーンする前に、以下に答えてください:
- それはどのように終了するか? — コンテキストキャンセル、チャネルクローズ、または明示的シグナル
- 停止するようシグナルできるか? —
context.Contextまたは done チャネルを渡す - それを待つことができるか? —
sync.WaitGroupまたはerrgroup - チャネルの所有者は誰か? — 作成者/送信者が所有し、クローズする
- これは同期的にすべきではないか? — 測定された必要がなければ並行処理を追加しない
パイプラインとワーカープール
パイプラインパターン(ファンアウト/ファンイン、バウンドワーカー、ジェネレータチェーン、Go 1.23+ イテレータ、samber/ro)については、Pipelines and Worker Pools を参照してください。
並行処理監査の並列化
大きなコードベース全体の並行処理を監査する場合、最大 5 つの並列サブエージェント(Agent ツール)を使用してください:
- すべてのゴルーチンスポーン(
go func,go method)を検出し、シャットダウンメカニズムを検証 - ミューテックスなしで同期化された可変グローバルと共有状態を検索
- チャネル使用を監査 — 所有権、方向、クロージャー、バッファサイズ
- ループ内の
time.After、select の欠落ctx.Done()、バウンドなしのスポーンを検出 - ミューテックス使用、
sync.Map、アトミックス、スレッドセーフティドキュメントを確認
よくある間違い
| 間違い | 修正 |
|---|---|
| ファイアアンドフォーゲットゴルーチン | 停止メカニズム(context、done チャネル)を提供 |
| 受信側からチャネルをクローズ | 送信側のみがクローズ |
ホットループで time.After | time.NewTimer + Reset を再利用 |
select の欠落 ctx.Done() | キャンセルを許可するため常に context 上で select |
| バウンドなしのゴルーチンスポーン | errgroup.SetLimit(n) またはセマフォを使用 |
| チャネル経由でポインタを共有 | コピーまたは不変値を送信 |
ゴルーチン内の wg.Add | Wait が早期に戻る可能性があるため、go の前に Add を呼び出す |
CI で -race を忘れる | 常に go test -race ./... を実行 |
| I/O をまたいでミューテックスを保持 | クリティカルセクションを短く保つ |
相互参照
- -> パフォーマンス、キャッシュラインパディング、
sync.Poolホットパスパターンについてはsamber/cc-skills-golang@golang-performanceスキルを参照 - -> キャンセル伝播とタイムアウトパターンについては
samber/cc-skills-golang@golang-contextスキルを参照 - -> 同時マップアクセスとレース条件防止については
samber/cc-skills-golang@golang-safetyスキルを参照 - -> ゴルーチンリークとデッドロックのデバッグについては
samber/cc-skills-golang@golang-troubleshootingスキルを参照 - -> グレースフルシャットダウンパターンについては
samber/cc-skills-golang@golang-design-patternsスキルを参照 - -> これらのガイドラインを使用した CI での自動化 AI 駆動コードレビューについては
samber/cc-skills-golang@golang-continuous-integrationスキルを参照
参考資料
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- samber
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/samber/cc-skills-golang / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。