
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
パッケージ句
パッケージ句は各ソースファイルの冒頭に置かれ、そのファイルが属するパッケージを定めます。
PackageClause = "package" PackageName .
PackageName = identifier .
PackageName にブランク識別子を使ってはいけません。
package math
同じ PackageName を共有するファイルの集まりが、1つのパッケージの実装を構成します。実装によっては、あるパッケージのすべてのソースファイルが同じディレクトリに存在することを要求する場合があります。
解説
結論:ファイルの先頭に書く package 名前 がパッケージ句。同じ名前を書いたファイル同士が1つのパッケージになる。名前に _ だけは使えない。
パッケージ句の書き方
package というキーワードのうしろにパッケージ名を書く、それだけです。
package math
文法定義 PackageClause = "package" PackageName . は、「パッケージ句は package という固定の単語と、その後ろのパッケージ名でできている」という意味です。続く PackageName = identifier . は、「パッケージ名は識別子(identifier、名前として使える文字列)である」ことを表します。
ブランク識別子は使えない
原文が禁止しているのは、パッケージ名を _(アンダースコア1文字)にすることです。
package _ // エラー:これは許されない
_ はGoで「ブランク識別子」と呼ばれる特別な記号で、「値を受け取るけど捨てる」という意味で使われます。例えば次のように、いらない戻り値を捨てるときに登場します。
_, err := fmt.Println("hi") // 1つ目の戻り値は捨てて、errだけ使う
このように _ は「名前を付けない」ことを表す記号なので、パッケージの名前として使うのは矛盾します。だから禁止されています。
同じ名前のファイルが1つのパッケージになる
これは前の節でも触れた内容の再確認です。バラバラのファイルでも、先頭に同じ package math と書いてあれば、それらは合わさって1つの math パッケージとして扱われます。
// add.go
package math
func Add(a, b int) int { return a + b }
// sub.go
package math
func Sub(a, b int) int { return a - b }
この2ファイルは、合わせて1つの math パッケージの「実装(implementation)」になります。チームに例えると、同じチーム名のユニフォームを着た選手が集まって1つのチームになる、というイメージです。
「同じディレクトリに置く」という制約
最後の一文がやや回りくどい表現になっています。原文は “An implementation may require that…”(実装によっては~を要求する場合がある)と書かれています。
ここでいう「実装(implementation)」とは、Goのコンパイラなど、Go言語を実際に動かすツールのことを指します。仕様としては緩く書かれていますが、実際に広く使われている標準のGo(公式コンパイラ)では、1つのパッケージのファイルは同じディレクトリにまとめて置く必要があります。
math/
├── add.go ← package math
└── sub.go ← package math
つまり実務上は「1ディレクトリ=1パッケージ」と覚えておけば問題ありません。仕様の文章が「may require(要求する場合がある)」と曖昧なのは、言語仕様としてあらゆる実装を縛りすぎないための書き方であって、現実のGoでは事実上の必須ルールだと理解してください。
補足:ディレクトリ名とパッケージ名は一致させるのが慣習ですが、文法上は必須ではありません。ただし混乱を避けるため、特別な理由がない限り一致させるべきです(例:math/ ディレクトリの中身は package math)。
おわりに
本日は、Go言語の言語仕様について解説しました。

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)

コメント