go-concurrency
Goroutine、チャネル、Mutex、スレッドセーフ保証など、Goの並行処理コードを記述する際に使用します。ユーザーが明示的に並行処理の概念に言及していなくても、処理の並列化、データ競合の修正、共有状態の保護が必要な場面でも適用されます。なお、`context.Context` のパターンはカバーしません(go-context を参照)。
description の原文を見る
Use when writing concurrent Go code — goroutines, channels, mutexes, or thread-safety guarantees. Also use when parallelizing work, fixing data races, or protecting shared state, even if the user doesn't explicitly mention concurrency primitives. Does not cover context.Context patterns (see go-context).
SKILL.md 本文
Go 並行処理
ゴルーチンのライフタイム
規範的: ゴルーチンを生成するときは、いつ終了するか、または終了するかどうかを明確にしてください。
ゴルーチンはチャネルの送受信でブロックされてリークする可能性があります。GC は、他のゴルーチンがチャネルへの参照を保持していない場合でも、ブロックされたゴルーチンを終了しません。リークしていない飛行中のゴルーチンでも、パニック (閉じたチャネルへの送信)、データレース、メモリ問題、リソースリークが発生します。
コアルール
- すべてのゴルーチンに停止メカニズムが必要 — 予測可能な終了時刻、キャンセル信号、またはその両方
- コードはゴルーチンの終了を待つことが可能である必要がある
init()にゴルーチンを配置しない — 代わりに (Close、Stop、Shutdownなどの) ライフサイクルメソッドを公開する- 同期をスコープ内に保つ — 関数スコープに制限し、ロジックを同期関数に分解する
// Good: WaitGroup で明確なライフタイム
var wg sync.WaitGroup
for item := range queue {
wg.Add(1)
go func() { defer wg.Done(); process(ctx, item) }()
}
wg.Wait()
// Bad: 停止または待機する方法がない
go func() { for { flush(); time.Sleep(delay) } }()
go.uber.org/goleak でリークをテストしてください。
原則: ゴルーチンをどのように停止するかを知らずに開始しないでください。
停止/完了チャネルパターン、ゴルーチン待機戦略、またはライフサイクル管理ワーカーを実装するときは、
references/GOROUTINE-PATTERNS.mdを読んでください。
通信による共有
"メモリを共有することによって通信するのではなく、代わりに通信することによってメモリを共有しなさい。"
これは Go の基盤となる並行処理設計原則です。所有権の譲渡とオーケストレーション用に チャネル を使用してください — 1 つのゴルーチンが値を生成し、別のゴルーチンが消費する場合です。複数のゴルーチンが共有状態にアクセスし、チャネルが不要な複雑さを追加する場合は、ミューテックス を使用してください。
デフォルトはチャネル。 問題が本質的にゴルーチン間のデータ受け渡しではなく、共有データ構造 (キャッシュやカウンターなど) を保護することである場合は、sync.Mutex / sync.RWMutex にフォールバックします。
同期関数
規範的: 非同期関数よりも同期関数を優先してください。
| メリット | 理由 |
|---|---|
| ローカライズされたゴルーチン | ライフタイムを推論しやすい |
| リークとレースを回避 | リソースリークとデータレースを防ぎやすい |
| テストしやすい | ポーリングなしで入出力を確認できる |
| 呼び出し元の柔軟性 | 必要に応じて呼び出し元が並行性を追加できる |
助言: 呼び出し元で不要な並行性を削除することはかなり困難です (時には不可能です)。必要に応じて呼び出し元に並行性を追加させてください。
呼び出し元がゴルーチンでラップする可能性のある同期優先 API を書くときは、
references/GOROUTINE-PATTERNS.mdを読んでください。
ゼロ値ミューテックス
sync.Mutex と sync.RWMutex のゼロ値は有効です — ほぼ ミューテックスへのポインタが必要になることはありません。
// Good: ゼロ値は有効 // Bad: 不要なポインタ
var mu sync.Mutex mu := new(sync.Mutex)
ミューテックスを埋め込まない — Lock/Unlock を実装の詳細に保つために、名前付き mu フィールドを使用してください。エクスポートされた API ではありません。
ミューテックス保護構造の実装またはミューテックスフィールドの構造化方法を決定するときは、
references/SYNC-PRIMITIVES.mdを読んでください。
チャネル方向
規範的: 可能な限りチャネル方向を指定してください。
方向はエラーを防ぎ (コンパイラが受け取り専用チャネルのクローズをキャッチ)、所有権を伝え、自己説明的です。
func produce(out chan<- int) { /* 送信専用 */ }
func consume(in <-chan int) { /* 受信専用 */ }
func transform(in <-chan int, out chan<- int) { /* 両方 */ }
チャネルサイズ: 1 または 0
チャネルのサイズは 0 (バッファなし) または 1 である必要があります。その他のサイズには以下の正当化が必要です:
- サイズをどのように決定したか
- 負荷下でチャネルがいっぱいになるのを何が防ぐか
- ライターがブロックされるとどうなるか
c := make(chan int) // バッファなし — Good
c := make(chan int, 1) // サイズ 1 — Good
c := make(chan int, 64) // 任意 — 正当化が必要
エラーが発生しやすいパターンの詳細なチャネル方向の例を確認するときは、
references/SYNC-PRIMITIVES.mdを読んでください。
アトミック操作
型安全なアトミック操作用に atomic.Bool、atomic.Int64 などを使用します (Go 1.19 以降の stdlib sync/atomic、または go.uber.org/atomic)。生の int32/int64 フィールドは、一部のコードパスでアトミックアクセスを忘れやすくなります。
// Good: 型安全 // Bad: 忘れやすい
var running atomic.Bool var running int32 // atomic
running.Store(true) atomic.StoreInt32(&running, 1)
running.Load() running == 1 // race!
sync/atomic と go.uber.org/atomic の選択、または構造体でのアトミック状態フラグの実装を行うときは、
references/SYNC-PRIMITIVES.mdを読んでください。
並行性ドキュメント
助言: 操作タイプから明らかでない場合は、スレッド安全性をドキュメント化してください。
Go ユーザーは読み取り専用操作が並行使用に対して安全であると想定し、変更操作は安全ではないと想定しています。以下の場合は並行性をドキュメント化します:
- 読み取り対変更が不明確 — 例: LRU 状態を変更する
Lookup - API が同期を提供 — 例: スレッド安全なクライアント
- インターフェースに並行性要件がある — 型定義でドキュメント化
Context 使用方法
context.Context ガイダンス (パラメータの配置、構造体ストレージ、カスタムタイプ、導出パターン) については、専用の
go-contextスキルを参照してください。
チャネルでのバッファプーリング
バッファされたチャネルをフリーリストとして使用して、割り当てられたバッファを再利用します。この "漏れているバッファ" パターンはノンブロッキング操作用に select と default を使用します。
再利用可能なバッファを持つワーカープールを実装するとき、またはチャネルベースのプールと
sync.Poolの間で選択するときは、references/BUFFER-POOLING.mdを読んでください。
高度なパターン
チャネルのチャネルを使用したリクエスト-レスポンス多重化、またはコア間の CPU バウンド並列計算を実装するときは、
references/ADVANCED-PATTERNS.mdを読んでください。
関連スキル
- コンテキスト伝播: ゴルーチンを通じてキャンセル、デッドライン、またはリクエストスコープの値を渡すときは、
go-contextを参照してください - エラーハンドリング: ゴルーチンからエラーを伝播する、または errgroup を使用するときは、
go-error-handlingを参照してください - 防御的強化: API の境界での共有状態を保護する、または cleanup に defer を使用するときは、
go-defensiveを参照してください - インターフェース設計: 同期プリミティブを持つ型のレシーバー型を選択するときは、
go-interfacesを参照してください
外部リソース
- Never start a goroutine without knowing how it will stop — Dave Cheney
- Rethinking Classical Concurrency Patterns — Bryan Mills (GopherCon 2018)
- When Go programs end — Go Time podcast
- go.uber.org/goleak — テスト用ゴルーチンリーク検出器
- go.uber.org/atomic — 型安全なアトミック操作
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cxuu
- リポジトリ
- cxuu/golang-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。