go-code-review
Goコードのレビュー時やコミュニティのスタイル基準との照合に使用します。ユーザーが明示的に要求しなくても、Go PRの提出前やGoコードの変更レビュー時に積極的に活用してください。言語固有の構文はカバーせず、専門スキルに委譲します。
description の原文を見る
Use when reviewing Go code or checking code against community style standards. Also use proactively before submitting a Go PR or when reviewing any Go code changes, even if the user doesn't explicitly request a style review. Does not cover language-specific syntax — delegates to specialized skills.
SKILL.md 本文
Go コードレビューチェックリスト
レビュー手順
コードレビューの出力をフォーマットする際は、
assets/review-template.mdを使用して、Must Fix / Should Fix / Nits の重大度分類で一貫した構造を確保してください。
gofmt -d .とgo vet ./...を実行して機械的な問題をまず捕捉する- diff をファイルごとに読み込み、各ファイルについて以下のカテゴリを順番に確認する
- 具体的な行番号とルール名で問題をフラグ付けする
- すべてのファイルをレビューした後、フラグ付けした項目を再度読んで本当の問題であることを確認する
- 重大度別(must-fix、should-fix、nit)にグループ分けして結果をまとめる
検証: レビュー完了後、diff を一度以上再度読み、フラグ付けした問題がすべて実在するものであることを確認します。具体的な行番号で正当化できない結果は削除します。
フォーマット
- gofmt: コードが
gofmtまたはgoimportsでフォーマットされている →go-linting
ドキュメンテーション
- コメント文: コメントは説明対象の名前で始まり、ピリオドで終わる完全な文である →
go-documentation - Doc コメント: すべてのエクスポートされた名前に doc コメントがある。自明でないエクスポートされていない宣言にもある →
go-documentation - パッケージコメント: パッケージコメントは package 句に隣接し、空行がない →
go-documentation - 名前付き結果パラメータ: 意味を明確にする場合(例:同じ型の複数戻り値)のみ使用し、naked return を有効にするためだけに使用しない →
go-documentation
エラー処理
- エラー処理:
_でエラーを無視しない。処理するか、返すか、または(例外的に)panic する →go-error-handling - エラー文字列: 小文字で、句読点なし(固有名詞や頭字語で始まる場合を除く) →
go-error-handling - 帯域内エラー: マジックバリュー(-1、""、nil)を使用しない。複数返却とエラーまたは ok bool を使用する →
go-error-handling - エラーフロー制御: エラーを最初に処理して戻す。通常のパスを最小インデントに保つ →
go-error-handling
命名規則
- MixedCaps:
MixedCapsまたはmixedCapsを使用し、アンダースコアは使用しない。エクスポートされていない場合はmaxLengthでありMAX_LENGTHではない →go-naming - イニシャリズム: 一貫した大文字小文字を保つ:
URL/url、ID/id、HTTP/http(例:ServeHTTP、xmlHTTPRequest) →go-naming - 変数名: スコープが限定されている場合は短い名前(
i、r、c)。スコープが広い場合は長い名前 →go-naming - レシーバ名: 型の 1~2 文字の短縮形(
Clientの場合はc)。this、self、meは使用しない。メソッド間で一貫している →go-naming - パッケージ名: スタッタリングなし(
chubby.ChubbyFileではなくchubby.Fileを使用)。util、common、miscを避ける →go-packages - ビルトイン名を避ける:
error、string、len、cap、append、copy、new、makeをシャドーイングしない →go-declarations
並行処理
- ゴルーチンのライフタイム: ゴルーチンがいつ、かどうか終了するかが明確である。明白でない場合はドキュメント化する →
go-concurrency - 同期関数: 非同期より同期を優先する。呼び出し側が必要に応じて並行処理を追加できるようにする →
go-concurrency - Context: 第一パラメータ。構造体に含めない。カスタム Context 型を作成しない。必要ないと思っていても渡す →
go-context
インターフェース
- インターフェースの位置: コンシューマパッケージで定義し、実装側では定義しない。プロデューサから具体的な型を返す →
go-interfaces - 時期尚早なインターフェース: 使用する前に定義しない。実装側でモッキング用に定義しない →
go-interfaces - レシーバ型: ミュテーション、同期フィールド、または大きい場合はポインタを使用する。小さい不変型の場合は値を使用する。混在させない →
go-interfaces
データ構造
- 空のスライス:
t := []string{}(非 nil ゼロ長)ではなくvar t []string(nil)を優先する →go-data-structures - コピー: ポインタ/スライスフィールド持つ構造体のコピーに注意する。
*Tメソッドのレシーバを値でコピーしない →go-data-structures
セキュリティ
- 暗号乱数:
math/randではなくcrypto/randをキーに使用する →go-defensive - Panic しない: 通常のエラー処理にはエラー戻り値を使用する。panic は本当に例外的な場合のみ使用する →
go-defensive
宣言と初期化
- 類似するものをグループ化: 関連する
var/const/typeを括弧ブロックにグループ化。無関係なものは分離する →go-declarations - var vs :=: 意図的なゼロ値には
varを使用。明示的な代入には:=を使用する →go-declarations - スコープを削減: 宣言を使用場所の近くに移動する。if-init を使用して変数スコープを制限する →
go-declarations - 構造体初期化: 常にフィールド名を使用する。ゼロフィールドは省略する。ゼロ構造体は
varを使用する →go-declarations -
anyを使用: 新しいコードではinterface{}ではなくanyを優先する →go-declarations
関数
- ファイル順序: 型 → コンストラクタ → エクスポートされたメソッド → エクスポートされていない → ユーティリティ →
go-functions - シグネチャフォーマット: ラップする場合、すべての引数を個別の行に配置し、末尾にカンマを付ける →
go-functions - Naked パラメータ: 曖昧な bool/int 引数には
/* name */コメントを追加するか、カスタム型を使用する →go-functions - Printf 命名: フォーマット文字列を受け入れる関数は
go vetのためにfで終わる →go-functions
スタイル
- 行長: 厳密な制限はないが、不快なほど長い行を避ける。任意の長さではなく、セマンティクスで改行する →
go-style-core - Naked return: 短い関数のみ。中程度/大きい関数では明示的な return を使用する →
go-style-core - 値を渡す: バイト数を節約するためだけにポインタを使用しない。小さい固定サイズ型の場合は
*stringではなくstringを渡す →go-performance - 文字列連結: シンプルな場合は
+。フォーマットの場合はfmt.Sprintf。ループの場合はstrings.Builder→go-performance
ログ
- slog を使用: 新しいコードは
logやfmt.Printlnではなくlog/slogを使用する →go-logging - 構造化フィールド: ログメッセージは fmt.Sprintf ではなく、キーバリューペア属性を含む静的文字列を使用する →
go-logging - 適切なレベル: Debug は開発者トレース用。Info は注目すべきイベント用。Warn は回復可能な問題用。Error は失敗用 →
go-logging - ログにシークレットを含めない: PII、認証情報、トークンはログに記録しない →
go-logging
インポート
- インポートグループ: 標準ライブラリが最初、空行、外部パッケージ →
go-packages - インポートリネーム: 衝突がない限り避ける。衝突時にはローカル/プロジェクト固有のインポートをリネームする →
go-packages - インポート blank:
import _ "pkg"は main パッケージまたはテストのみ →go-packages - インポート dot: テストの循環依存ワークアラウンドのみ →
go-packages
ジェネリクス
- 使用時機: 複数の型が同じロジックを共有し、インターフェースでは十分でない場合のみ →
go-generics - 型エイリアス: 新しい型には定義を使用。エイリアスはパッケージマイグレーション時のみ →
go-generics
テスト
- 例: 実行可能な
Example関数またはテストで使用方法を説明する →go-documentation - 有用なテスト失敗: メッセージは何が間違っていたか、入力、得られた値、期待値を含む。順序は
got != want→go-testing - TestMain: すべてのテストに共通セットアップ(テアダウン付き)が必要な場合のみ使用。まずスコープ付きヘルパーを優先する →
go-testing - 実際のトランスポート: HTTP モッキングより
httptest.NewServer+ 実際のクライアントを優先する →go-testing
自動化チェック
自動プレレビューチェックを実行します:
bash scripts/pre-review.sh ./... # text output
bash scripts/pre-review.sh --json ./... # structured JSON output
または手動で実行:gofmt -l <path> && go vet ./... && golangci-lint run ./...
進める前に、すべての問題を修正してください。リント設定については、go-linting を参照してください。
統合例
プロダクション HTTP サーバーを構築し、並行処理、エラー処理、context、ドキュメンテーション、命名規則を統合して検証したい場合は、
references/WEB-SERVER.mdを読んでください。
関連スキル
- スタイルの基礎: フォーマットについての議論を解決するか、clarity > simplicity > concision の優先度を適用する場合は
go-style-coreを参照してください - リント設定: golangci-lint を設定するか、CI に自動チェックを追加する場合は
go-lintingを参照してください - エラー戦略: エラーラップ、sentinel エラー、handle-once パターンをレビューする場合は
go-error-handlingを参照してください - 命名規則: 識別子名、レシーバ名、またはパッケージシンボルのスタッタリングを評価する場合は
go-namingを参照してください - テストパターン: テストコード、table-driven 構造、失敗メッセージ、またはヘルパー使用をレビューする場合は
go-testingを参照してください - 並行処理安全性: ゴルーチンのライフタイム、チャネル使用、またはミューテックス配置をレビューする場合は
go-concurrencyを参照してください - ログプラクティス: ログの使用、構造化ログ、または slog 設定をレビューする場合は
go-loggingを参照してください
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cxuu
- リポジトリ
- cxuu/golang-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0
関連スキル
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を通じてオンチェーン取引とデータ照会を実現します。