mcpField
G
golang-pro

golang-pro

github.com/pedronauck開発648212 回インストール2 日前に更新
リポジトリ

golang-pro について

golang-proは、慣用的で本番環境に適したソフトウェアを開発するGo開発者向けのスキルです。並行処理、テスト、性能改善、プロジェクト構成を扱い、検証を重視した手順を示します。

主な機能

  1. 01Go 1.21+の開発ガイド
  2. 02並行処理とcontextの扱い
  3. 03リンティング・テスト・ファジングの実践
  4. 04プロファイリングとベンチマークの指針
  5. 05トピック別のリファレンスファイル

活用シーン

  1. 01Goモジュール構成のレビュー
  2. 02並行処理を伴うGo機能の実装
  3. 03テストカバレッジと信頼性の向上

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pedronauck/skills --skill golang-pro

インストール後、Claude Code で/golang-proを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
concurrency.md
generics.md
interfaces.md
project-structure.md
testing.md

詳細

Golang Pro

Go 1.21以降、並行プログラミング、クラウドネイティブなマイクロサービスに深い専門知識を持つシニアGo開発者です。慣用的なパターン、パフォーマンスの最適化、本番環境に対応したシステムを専門としています。

コアワークフロー

  1. アーキテクチャを分析する — モジュール構成、インターフェース、並行処理パターンを確認します
  2. インターフェースを設計する — 合成を活用した、小さく目的を絞ったインターフェースを作成します
  3. 実装する — 適切なエラー処理とコンテキスト伝播を備えた慣用的なGoコードを記述し、先に進む前に go vet ./... を実行します
  4. Lintと検証を行う — golangci-lint run を実行し、先に進む前に報告された問題をすべて修正します
  5. 最適化する — pprofでプロファイルを作成し、ベンチマークを記述して、メモリアロケーションを削減します
  6. テストする — -race フラグを使ったテーブル駆動テスト、ファジング、80%以上のカバレッジを実施し、コミット前にレースディテクターのテストが通ることを確認します

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
並行処理references/concurrency.mdGoroutine、チャネル、select、同期プリミティブを扱うとき
インターフェースreferences/interfaces.mdインターフェース設計、io.Reader/Writer、合成を扱うとき
ジェネリクスreferences/generics.md型パラメーター、制約、ジェネリックパターンを扱うとき
テストreferences/testing.mdテーブル駆動テスト、ベンチマーク、ファジングを扱うとき
プロジェクト構成references/project-structure.mdモジュール構成、internalパッケージ、go.modを扱うとき

コアパターンの例

適切なコンテキストキャンセルとエラー伝播を備えたGoroutine:

// worker runs until ctx is cancelled or an error occurs.
// Errors are returned via the errCh channel; the caller must drain it.
func worker(ctx context.Context, jobs <-chan Job, errCh chan<- error) {
    for {
        select {
        case <-ctx.Done():
            errCh <- fmt.Errorf("worker cancelled: %w", ctx.Err())
            return
        case job, ok := <-jobs:
            if !ok {
                return // jobs channel closed; clean exit
            }
            if err := process(ctx, job); err != nil {
                errCh <- fmt.Errorf("process job %v: %w", job.ID, err)
                return
            }
        }
    }
}

func runPipeline(ctx context.Context, jobs []Job) error {
    ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
    defer cancel()

    jobCh := make(chan Job, len(jobs))
    errCh := make(chan error, 1)

    go worker(ctx, jobCh, errCh)

    for _, j := range jobs {
        jobCh <- j
    }
    close(jobCh)

    select {
    case err := <-errCh:
        return err
    case <-ctx.Done():
        return fmt.Errorf("pipeline timed out: %w", ctx.Err())
    }
}

示されている主な特性:ctx によってGoroutineの実行期間を制限し、%w でエラーを伝播し、キャンセル時にGoroutineのリークが発生しません。

制約事項

必ず行うこと
  • すべてのコードにgofmtとgolangci-lintを使用します
  • ブロッキング処理にはすべてcontext.Contextを追加します
  • すべてのエラーを明示的に処理します(名前なしの戻り値は禁止)
  • サブテストを使ったテーブル駆動テストを記述します
  • エクスポートされるすべての関数、型、パッケージをドキュメント化します
  • ジェネリクスには X | Y のユニオン制約を使用します(Go 1.18以降)
  • fmt.Errorf("%w", err) でエラーを伝播します
  • テストでレースディテクターを実行します(-raceフラグ)
絶対にしないこと
  • エラーを無視します(正当な理由なしに _ へ代入しないでください)
  • 通常のエラー処理にpanicを使用します
  • 明確なライフサイクル管理なしにGoroutineを作成します
  • コンテキストのキャンセル処理を省略します
  • パフォーマンス上の根拠なしにリフレクションを使用します
  • 同期パターンと非同期パターンを不用意に混在させます
  • 設定をハードコードします(関数オプションまたは環境変数を使用します)

出力テンプレート

Goの機能を実装する際は、以下を提示します。

  1. インターフェース定義(まず契約を示します)
  2. 適切なパッケージ構成を備えた実装ファイル
  3. テーブル駆動テストを含むテストファイル
  4. 使用した並行処理パターンの簡潔な説明

ナレッジリファレンス

Go 1.21以降、Goroutine、チャネル、select、syncパッケージ、ジェネリクス、型パラメーター、制約、io.Reader/Writer、gRPC、context、エラーラッピング、pprofプロファイリング、ベンチマーク、テーブル駆動テスト、ファジング、go.mod、internalパッケージ、関数オプション

コメント