mcpField
G
go-dev

go-dev

github.com/doccker開発1.1k45 回インストール9 週間前に更新
リポジトリ

go-dev について

go-devは、Go開発者向けのコーディング規約スキルです。命名、エラー、並行処理、テスト、性能の実践と、プロジェクト構成の指針をまとめています。

主な機能

  1. 01goimportsと静的検査の指針
  2. 02命名とインポート順の規約
  3. 03エラー処理とラップの原則
  4. 04並行処理とライフサイクル管理
  5. 05テーブル駆動テストと競合検査
  6. 06性能と構成に関する助言

活用シーン

  1. 01Goプロジェクトの規約統一
  2. 02エラー処理と並行コードの計画
  3. 03テスト、プロファイリング、構成の整理

インストール

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

$npx skills add https://github.com/doccker/cc-use-exp --skill go-dev

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

同梱ファイルreferences/date-time.mdreferences/go-style.md

詳細

Go 開発規約

参考資料: Effective Go、Go Code Review Comments、uber-go/guide


ツールチェーン

goimports -w .                    # 格式化并整理 import
go vet ./...                      # 静态分析
golangci-lint run                 # 综合检查
go test -v -race -cover ./...     # 测试(含竞态检测和覆盖率)

命名規則

種類ルール例
パッケージ名小文字の単語を使用し、アンダースコアは使わないuser, orderservice
変数/関数キャメルケースを使用し、略語の大文字・小文字を統一するuserID, HTTPServer
定数エクスポートする場合はキャメルケース、非公開の場合はキャメルケースまたはすべて大文字MaxRetryCount
インターフェースメソッドが1つの場合は、メソッド名+erReader, Writer

禁止: common, util, base などの意味のないパッケージ名


import の順序

import (
    "context"           // 标准库
    "fmt"

    "github.com/gin-gonic/gin"  // 第三方库

    "project/internal/model"     // 项目内部
)

エラー処理

エラーは必ず処理してください。無視してはいけません。

// ✅ 好:添加上下文
if err != nil {
    return fmt.Errorf("failed to query user %d: %w", userID, err)
}

// ❌ 差:忽略错误
result, _ := doSomething()

エラーのラップ: %w を使ってエラーチェーンを保持し、errors.Is()/errors.As() で確認します。


並行プログラミング

基本原則:

  • 通信には channel を優先して使用します
  • goroutine を起動する前に、誰が待機するのか、どう停止するのかを検討します
  • context.Context を使ってライフサイクルを制御します
// ✅ 好:使用 context 控制
func process(ctx context.Context) error {
    done := make(chan error, 1)
    go func() { done <- doWork() }()

    select {
    case err := <-done:
        return err
    case <-ctx.Done():
        return ctx.Err()
    }
}

データ競合: go test -race を使って検出します


テスト規約

// 表驱动测试
func TestAdd(t *testing.T) {
    tests := []struct {
        name     string
        a, b     int
        expected int
    }{
        {"positive", 1, 2, 3},
        {"zero", 0, 0, 0},
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got := Add(tt.a, tt.b)
            if got != tt.expected {
                t.Errorf("Add(%d, %d) = %d, want %d", tt.a, tt.b, got, tt.expected)
            }
        })
    }
}

パフォーマンスの最適化

落とし穴解決策
ループ内での文字列連結strings.Builder を使用する
slice の事前割り当てがないmake([]T, 0, cap)
N+1 クエリ一括クエリ+事前ロード
並行処理数に制限がないsemaphore または worker pool を使用する
Raw SQL のエイリアスに予約語を使用しているyear_month/order/status/rank などの MySQL 予約語をエイリアスに使わない
# 性能分析
go test -cpuprofile=cpu.prof -bench=.
go tool pprof cpu.prof

プロジェクト構成

project/
├── cmd/                    # 可执行文件入口
├── internal/               # 私有代码
│   ├── handler/
│   ├── service/
│   ├── repository/
│   └── model/
├── pkg/                    # 公共代码
├── go.mod
└── go.sum

詳細な参考資料

ファイル内容
references/go-style.md命名規則、エラー処理、並行処理、テスト、パフォーマンス
references/date-time.md日付の加算・減算、請求期間の計算、AddDate のオーバーフロー処理

📋 この回答は go-dev - [具体的な章] に準拠しています。

コメント