go-dev について
go-devは、Go開発者向けのコーディング規約スキルです。命名、エラー、並行処理、テスト、性能の実践と、プロジェクト構成の指針をまとめています。
主な機能
- 01goimportsと静的検査の指針
- 02命名とインポート順の規約
- 03エラー処理とラップの原則
- 04並行処理とライフサイクル管理
- 05テーブル駆動テストと競合検査
- 06性能と構成に関する助言
活用シーン
- 01Goプロジェクトの規約統一
- 02エラー処理と並行コードの計画
- 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つの場合は、メソッド名+er | Reader, 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- [具体的な章] に準拠しています。
コメント
Markdown 対応