
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
パッケージ
Goのプログラムは、パッケージ同士をリンクすることで構築されます。そしてパッケージは、1つ以上のソースファイルから構築されます。それらのソースファイルは、そのパッケージに属する定数・型・変数・関数を宣言し、それらは同じパッケージ内のすべてのファイルからアクセスできます。また、これらの要素はエクスポートして、別のパッケージから使うこともできます。
解説
結論:Goのプログラムは「パッケージ」という部品の集まりであり、パッケージは複数のファイルに分かれていても1つのまとまりとして扱われる。
パッケージとは何か
「パッケージ」は、関連するコードをひとまとめにした箱だと考えてください。料理に例えると、「調味料」「野菜」「肉」のように、似たもの同士をまとめて引き出しに整理するイメージです。Goでは、似た役割を持つ定数・型・変数・関数を1つのパッケージにまとめます。
ファイルの先頭で、そのファイルがどのパッケージに属するかを宣言します。
package main
import "fmt"
func main() {
fmt.Println("Hello") // 標準出力に表示する
}
この package main が「このファイルは main というパッケージの一員ですよ」という宣言です。
1つのパッケージが複数ファイルに分かれてもよい
ここが初心者のつまづきやすいポイントです。原文の「1つ以上のソースファイルから構築される」という部分が示すとおり、同じパッケージは複数のファイルに分割できます。
例えば、shop というパッケージを次のように2ファイルに分けられます。
// product.go
package shop
type Product struct { // 商品をあらわす型
Name string
Price int
}
// order.go
package shop
func TotalPrice(p Product) int { // 合計金額を計算する
return p.Price
}
order.go の中で product.go の Product 型を、import なしでそのまま使えます。同じ shop パッケージに属しているからです。原文の「同じパッケージ内のすべてのファイルからアクセスできる」とはこのことです。学校のクラスに例えると、同じクラスの生徒同士は自己紹介なしでも名前で呼び合える、というイメージです。
エクスポート(別のパッケージから使う)
最後の一文が「エクスポート」です。パッケージ内の要素を他のパッケージからも使えるように公開する仕組みを指します。
Goでは、名前の先頭を大文字にするとエクスポート(公開)され、小文字だとそのパッケージ内だけの非公開になります。
package shop
func TotalPrice(p Product) int { // 大文字始まり → 外部から使える
return calcTax(p.Price)
}
func calcTax(price int) int { // 小文字始まり → このパッケージ内だけ
return price / 10
}
別のパッケージからは shop.TotalPrice(...) は呼べますが、shop.calcTax(...) は呼べません。マンションに例えると、エントランス(大文字=公開)は誰でも入れるが、各部屋(小文字=非公開)は住人しか入れない、という区別です。
補足:この節は概要にあたる部分で、import の書き方やパッケージ名の具体的なルールは後続の節で詳しく定義されます。
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント