Go言語を習得する上で、最も基本的かつ重要なルールの一つが命名規則です。
他のプログラミング言語と比較しても、Go言語は独自の美学と厳格な慣習を持っています。
特に「キャメルケース」の扱いは、コードの可読性だけでなく「公開範囲(Visibility)」という言語機能の根幹に直結しています。
本記事では、2026年現在の開発現場でも標準となっているGo言語の命名ルールについて、頭字語の扱いを含めて詳しく解説します。
Go言語におけるキャメルケースの役割と重要性
Go言語では、単語の区切りにアンダースコアを使用するスネークケース(snake_case)は原則として使用されません。
代わりに、単語の先頭を大文字にする、あるいは2番目以降の単語の先頭を大文字にする「キャメルケース(CamelCase)」が採用されています。
この命名規則が重要な理由は、識別子の最初の文字が「大文字」か「小文字」かによって、その識別子が外部パッケージから参照可能かどうかが決まるからです。
アッパーキャメルケース(PascalCase)によるエクスポート
識別子(変数名、関数名、構造体名、型名など)の最初の文字を大文字で書き始める形式を、アッパーキャメルケースと呼びます。
Go言語において、アッパーキャメルケースで命名された識別子は、「外部パッケージから参照可能(エクスポートされている)」ことを意味します。
これはオブジェクト指向言語における public キーワードに相当する役割を、命名規則だけで実現している非常にユニークな仕様です。
例えば、ライブラリを提供する場合、利用者に使ってもらいたい関数や構造体は必ずアッパーキャメルケースで命名する必要があります。
ローワーキャメルケースによるカプセル化
一方で、識別子の最初の文字を小文字で書き始める形式を、ローワーキャメルケースと呼びます。
ローワーキャメルケースで命名された識別子は、そのパッケージ内でのみ参照可能(エクスポートされていない)となります。
これは他の言語における private または internal に相当し、パッケージの内部実装を隠蔽するために使用されます。
このように、Go言語では命名規則がそのまま言語のアクセス制御機能として働いているため、キャメルケースの使い分けは絶対に誤ってはならないルールなのです。
頭字語(イニシャリズム)の扱いに関する厳格なルール
Go言語のキャメルケースにおいて、多くの初心者が迷うポイントが「XML」や「HTTP」、「ID」といった頭字語(Initialisms)の扱いです。
Goのコミュニティには明確なガイドラインがあり、「頭字語はすべて大文字、またはすべて小文字で統一する」というルールが存在します。
一貫性を保つためのスペリング
例えば、他の言語では getUserId や urlHost と書くことが一般的かもしれませんが、Go言語では推奨されません。
Go言語においては、「ID」や「URL」は一つの単語としてではなく、一つの頭字語として扱うため、その全ての文字のケースを一致させる必要があります。
以下の表は、一般的な頭字語の正しい表記と誤った表記の比較です。
| 対象 | 正しい表記(Goスタイル) | 誤った表記 |
|---|---|---|
| User ID | UserID | UserId |
| HTTP Server | HTTPServer | HttpServer |
| JSON Data | JSONData | JsonData |
| API Key | APIKey | ApiKey |
このように、頭字語が含まれる場合は、キャメルケースの中でもその単語の本来の大文字・小文字を維持することが求められます。
ローワーキャメルケースにおける頭字語
識別子をローワーキャメルケースで始める場合、その先頭にある頭字語はすべて小文字にします。
例えば、パッケージ内変数として「XMLリクエスト」を定義する場合、xmlRequest と記述します。
しかし、単語の途中に頭字語が現れる場合は、その頭字語の性質(すべて大文字)を維持します。
具体例を挙げると、parseXMLRequest のようになり、parseXmlRequest とは書きません。
このルールを徹底することで、コード全体で頭字語が浮き彫りになり、何に関する処理なのかが一目で判別できるようになります。
各エンティティにおける具体的な命名慣習
Go言語では、キャメルケースの適用以外にも、対象の性質に応じた命名の慣習があります。
これらを守ることで、より「Goらしい(Go idiomatic)」コードを書くことが可能になります。
パッケージ名の命名
パッケージ名は、キャメルケースさえも使いません。
パッケージ名は「すべて小文字の1単語」で命名するのが鉄則です。
複数の単語を組み合わせたい場合でも、アンダースコアやキャメルケースを使わずに表現するか、より適切な1単語を探すべきとされています。
例えば、user_profile ではなく userprofile、あるいは単に profile と命名します。
変数名の長さとスコープ
Go言語には「変数の寿命(スコープ)が短いほど、変数名は短くあるべき」という哲学があります。
ループのインデックスであれば i、関数の戻り値であるエラーであれば err、読み込みを行うオブジェクトであれば r (Readerの略)といった極めて短い名前が好まれます。
逆に、パッケージレベルで定義されるグローバルな変数や、スコープが広い変数については、意味が明確に伝わるキャメルケースによる命名を行います。
インターフェースの命名
Go言語のインターフェースは、メソッドを1つだけ持つ場合に「メソッド名 + er」という形で命名するのが一般的です。
例えば、Read メソッドを持つインターフェースは Reader、Write メソッドを持つものは Writer となります。
これらも当然キャメルケースのルールに従い、外部に公開する場合は Stringer のように大文字から始めます。
実践的なコードサンプル
ここまでのルールを統合した、実践的なプログラムの例を確認してみましょう。
構造体の定義、頭字語を含むメソッド、そしてエクスポートの制御がどのように行われているかに注目してください。
package main
import (
"fmt"
)
// UserInfo はユーザー情報を保持する構造体です。
// アッパーキャメルケースなので、パッケージ外から参照可能です。
type UserInfo struct {
// ID は頭字語なので全て大文字にします。
ID int
// Name はエクスポートされます。
Name string
// email は小文字で始まるため、パッケージ外からは見えません。
email string
}
// NewUserInfo は新しい UserInfo を作成する関数です。
func NewUserInfo(id int, name string, email string) UserInfo {
return UserInfo{
ID: id,
Name: name,
email: email,
}
}
// GetJSONData はJSON形式のデータを模した文字列を返します。
// JSONという頭字語をすべて大文字で維持しています。
func (u UserInfo) GetJSONData() string {
return fmt.Sprintf("{\"id\": %d, \"name\": \"%s\"}", u.ID, u.Name)
}
func main() {
// インスタンスの生成
user := NewUserInfo(1, "Go Taro", "taro@example.com")
// メソッドの呼び出し
jsonData := user.GetJSONData()
fmt.Println("ユーザー情報:")
fmt.Println(jsonData)
}
上記のコードを実行すると、以下のような結果が得られます。
ユーザー情報:
{"id": 1, "name": "Go Taro"}
このコード例では、UserInfo という型名や ID というフィールド名において、Go言語の推奨されるケーススタディが反映されています。
もし GetJSONData を GetJsonData と記述した場合、Goの静的解析ツールである go vet や golint (現在は revive や golangci-lint が主流)によって警告が表示されることになります。
命名規則におけるよくある失敗と対策
開発者が陥りやすいミスとその回避策を整理します。
getter/setter に「Get」を付けすぎる
他の言語、例えば Java などではフィールド name に対して getName() というメソッドを作るのが一般的です。
しかし、Go言語では getter メソッドに「Get」という接頭辞を付けないのが慣習です。
フィールド名が name(非公開)であれば、その値を返す公開メソッド名は単に Name() とします。
「Get」という言葉は、DBからの取得や計算を伴う重い処理など、特別な意味を持つ場合に限定して使用するのが賢明です。
パッケージ名と重複する命名
パッケージ名が user である場合、その中で定義する構造体を User と命名するのは推奨されますが、UserInfo や UserModel と冗長にする必要はありません。
利用側では user.User と呼び出すことになるため、パッケージ名と型名で十分に意味が通じるからです。
同様に、user.CreateUser() ではなく user.Create() と命名することで、呼び出し時のコードが user.Create() となり、非常にシンプルになります。
まとめ
Go言語における命名規則は、単なる見た目の好みではなく、プログラムの動作や設計哲学に密接に関わっています。
アッパーキャメルケースによるエクスポート制御、そして頭字語を一貫して大文字または小文字で扱うイニシャリズムのルールを正しく理解し、適用することが重要です。
特に以下の3点は、常に意識するようにしましょう。
- 公開するものは大文字から始めるアッパーキャメルケースにする。
- 頭字語(ID, HTTP, JSON等)は
Idのように崩さず、IDと記述する。 - 変数のスコープに合わせて、名前の長さと具体性を調整する。
これらのルールを遵守することで、Go言語の標準ライブラリのような、美しく読みやすいコードを書くことができるようになります。
プロジェクトの規模が大きくなるほど、こうした細かい命名の積み重ねがメンテナンス性に大きな差を生みます。
日々の開発において静的解析ツールを積極的に活用し、正しいキャメルケースの習慣を身につけていきましょう。
