mcpField
G
go-naming

go-naming

github.com/cxuu開発1871.3k 回インストール19 週間前に更新
リポジトリ

go-naming について

Go のパッケージ、識別子、レシーバー、変数の名前を決める開発者向けのスキルです。MixedCaps、頭字語、簡潔な命名の規則と、問題を確認するスクリプトを含みます。

主な機能

  1. 01パッケージと識別子の命名規則
  2. 02MixedCaps と頭字語の表記規則
  3. 03インターフェースとレシーバーの命名
  4. 04ゲッターと定数の命名指針
  5. 05命名チェック用スクリプト

活用シーン

  1. 01Go のパッケージ名と API 名の見直し
  2. 02識別子の一貫したリネーム
  3. 03コード内の命名アンチパターンの確認

インストール

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

$npx skills add https://github.com/cxuu/golang-skills --skill go-naming

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

同梱ファイル

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

references/
IDENTIFIERS.md
REPETITION.md
VARIABLES.md
scripts/
check-naming.sh

詳細

Go の命名規則

リソースの振り分け

  • scripts/check-naming.sh - SCREAMING_SNAKE_CASE 定数、Get 接頭辞付きゲッター、汎用的なパッケージ名、または this/self という名前のレシーバーを確認するときに実行します。
  • references/IDENTIFIERS.md - 頭字語、エクスポートされる識別子、パッケージレベルのシンボルの名前を選ぶときに読みます。
  • references/REPETITION.md - パッケージ、レシーバー、型、またはローカルの文脈と名前が重複するときに読みます。
  • references/VARIABLES.md - ローカル変数名、レシーバー名、またはループ識別子を選ぶときに読みます。

基本原則

名前は次のようにします。

  • 使用時に冗長に感じられない
  • 文脈を考慮する
  • すでに明らかな概念を繰り返さない

命名は科学というより芸術です。Go の名前は、他の言語より短くなる傾向があります。


命名の判断フロー

What are you naming?
├─ Package       → Short, lowercase, singular noun (no underscores, no mixedCaps)
├─ Interface     → Method name + "-er" suffix when single-method (Reader, Writer)
├─ Receiver      → 1-2 letter abbreviation of type (c for Client); consistent across methods
├─ Constant      → MixedCaps; use iota for enums; no ALL_CAPS
├─ Exported func → Verb or verb-phrase in MixedCaps; no Get prefix for getters
├─ Variable      → Length proportional to scope distance
│                  ├─ Tiny scope (1-7 lines) → single letter (i, n, r)
│                  ├─ Medium scope           → short word (count, buf)
│                  └─ Package-level / wide   → descriptive (userAccountCount)
└─ Any name      → Check: does it repeat package name or context? If yes, shorten it

MixedCaps(必須)

規範:すべての Go 識別子は MixedCaps を使用する必要があります。

アンダースコアが許可されるのは、テスト関数(TestFoo_InvalidInput)、生成コード、OS/cgo との相互運用に限られます。


パッケージ名

規範:パッケージ名は小文字で、アンダースコアを含めてはいけません。

短く、小文字の単数形の名詞を使います。util、common、helper のような汎用的な名前は避け、stringutil、httpauth、configloader のような具体的な名前を選びます。

// Good: user, oauth2, tabwriter
// Bad:  user_service, UserService, count (shadows var)

インターフェース名

推奨:メソッドが1つのインターフェースには「-er」接尾辞を使います。

メソッド名に「-er」を付けて、メソッドが1つのインターフェースに名前を付けます。例:Reader、Writer、Formatter。標準的なメソッド名(Read、Write、Close、String)とそのシグネチャーに従います。


レシーバー名

規範:レシーバーには短い略称を使い、一貫して使用する必要があります。

型を略した1文字または2文字を使い、すべてのメソッドで一貫させます。 func (c *Client) Connect()、func (c *Client) Send() のようにします。 this や self は決して使いません。


定数名

規範:定数には MixedCaps を使い、ALL_CAPS や K 接頭辞は使いません。

値ではなく役割に基づいて定数に名前を付けます。Three ではなく MaxRetries、Port8080 ではなく DefaultPort とします。

const MaxPacketSize = 512
const defaultTimeout = 30 * time.Second

頭字語と略語

規範:頭字語の大文字・小文字は、一貫して維持する必要があります。

頭字語(URL、ID、HTTP、API)はすべて大文字、またはすべて小文字にします。 HTTPClient、userID、ParseURL() のようにし、HttpClient、orderId、ParseUrl() とはしません。


関数名とメソッド名

推奨:単純なアクセサーには Get 接頭辞を付けず、アクションには動詞のような名前を使います。

フィールド owner のゲッターは GetOwner() ではなく Owner() とします。セッターは SetOwner() です。コストの高い処理には Compute または Fetch を使います。

型だけが異なる関数には、名前の末尾に型を含めます。 ParseInt()、ParseInt64() のようにします。


変数名

変数名は、簡潔さと明確さのバランスを取ります。主な原則は次のとおりです。

  • スコープに応じた長さ:小さなスコープでは短い名前(i、v)を使い、広いスコープでは長く説明的な名前を使います
  • 1文字の名前の慣例:よく知られたパターンを使います(インデックスには i、リーダー/ライターには r/w)
  • 名前に型を含めない:userSlice ではなく users、nameString ではなく name を使います
  • 非エクスポートのグローバル変数には接頭辞を付ける:シャドーイングを防ぐため、パッケージレベルの非エクスポート変数/定数には _ 接頭辞を使います
for i, v := range items { ... }           // small scope
pendingOrders := filterPending(orders)    // larger scope
const _defaultPort = 8080                 // unexported global

重複を避ける

Go の名前は、使用時に冗長に感じられないようにします。全体の文脈を考慮してください。

  • パッケージ+シンボル:widget.New() とし、widget.NewWidget() とはしません
  • レシーバー+メソッド:p.ProjectName() ではなく p.Name() とします
  • 文脈+型:パッケージ sqldb では、DBConnection ではなく Connection を使います

組み込み名を避ける

Go の事前宣言済み識別子(error、string、len、cap、 append、copy、new、make など)を、変数名、パラメーター名、型名としてシャドーイングしてはいけません。

詳しいガイダンス:go-declarations の「組み込み名の使用を避ける」セクションを参照してください。


クイックリファレンス

要素ルール例
パッケージ小文字、アンダースコアなしpackage httputil
エクスポート対象MixedCaps、大文字で始めるfunc ParseURL()
非エクスポート対象mixedCaps、小文字で始めるfunc parseURL()
レシーバー1~2文字の略称func (c *Client)
定数MixedCaps、すべて大文字にはしないconst MaxSize = 100
頭字語大文字・小文字の使い方を統一するuserID、XMLAPI
変数長さはスコープの大きさに合わせるi(小)、userCount(大)
組み込み名事前宣言された識別子をシャドーイングしないgo-declarations を参照

検証:識別子の名前を変更した後、bash scripts/check-naming.sh を実行して、命名に関するアンチパターンが残っていないことを確認します。次に、go build ./... を実行して、名前の変更によって問題が生じていないことを確認します。

関連スキル

  • インターフェースの命名:-er 接尾辞を使ったインターフェースの命名やレシーバー型の選択については、go-interfaces を参照してください
  • パッケージの命名:パッケージの命名、util/common の回避、インポートの衝突解決については、go-packages を参照してください
  • エラーの命名:センチネルエラー(ErrFoo)やカスタムエラー型の命名については、go-error-handling を参照してください
  • 宣言のスコープ:変数名の長さがスコープに応じて変わる場合や、組み込み名のシャドーイングを避ける場合は、go-declarations を参照してください
  • スタイルの原則:識別子名の明瞭さと簡潔さのバランスについては、go-style-core を参照してください

コメント