
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
式文(Expression statements)
特定の組み込み関数を除き、関数およびメソッドの呼び出しと受信操作は文の文脈に現れることができる。このような文は括弧で囲むことができる。
ExpressionStmt = Expression .
以下の組み込み関数は文の文脈では許可されない:
append cap complex imag len make new real
unsafe.Add unsafe.Alignof unsafe.Offsetof unsafe.Sizeof unsafe.Slice unsafe.SliceData unsafe.String unsafe.StringData
h(x+y)
f.Close()
<-ch
(<-ch)
len("foo") // len が組み込み関数の場合は不正
解説
式文ってなに?
式文は、式を文として実行することです。式は本来「値を計算するもの」ですが、副作用(画面出力、ファイル操作など)を目的として、値を捨てて実行だけする場面がたくさんあります。
fmt.Println("hello") // 戻り値 (int, error) を捨てて、出力だけ行う
f.Close() // 戻り値 error を捨てて、ファイルを閉じる
<-ch // 受信した値を捨てて、同期だけ行う
これらはすべて式(関数呼び出しやチャネル受信)ですが、値を使わずに「動作」だけを目的として実行しています。
文として使えるもの・使えないもの
すべての式が文として使えるわけではありません。
文として使えるもの:
h(x+y) // ✅ 関数呼び出し
f.Close() // ✅ メソッド呼び出し
<-ch // ✅ チャネル受信
文として使えないもの:
x + y // ❌ 単なる演算(副作用がないので意味がない)
42 // ❌ リテラル
len("foo") // ❌ 組み込み関数 len は文として使えない
x + y のような式を文として書いても、計算結果を何にも使わないので意味がありません。コンパイラはこれをエラーにします。
なぜ一部の組み込み関数が禁止されているのか
len、cap、make、append などの組み込み関数は、文の文脈で呼ぶことが禁止されています。
len("foo") // コンパイルエラー!
cap(mySlice) // コンパイルエラー!
append(s, 1) // コンパイルエラー!
なぜかというと、これらの関数は副作用を持たず、戻り値を使うことだけが目的だからです。戻り値を捨てて呼び出すのは、ほぼ確実にバグです。
// よくある間違い:append の結果を使い忘れる
append(s, 1) // コンパイルエラー!(結果を s に代入しないと意味がない)
s = append(s, 1) // ✅ 正しい使い方
append は元のスライスを変更するのではなく、新しいスライスを返す関数です。結果を代入しないと要素は追加されません。コンパイラがこのミスを防いでくれているわけです。
一方、fmt.Println のようなユーザー定義関数は、戻り値を捨てることが許可されています。画面出力という副作用が目的であり、戻り値(出力バイト数やエラー)を使わないことは妥当な場面が多いからです。
括弧で囲んでもOK
式文は括弧で囲むことができます。動作は変わりません。
<-ch // OK
(<-ch) // これも OK。同じ意味
これは構文上の都合で括弧が必要になる場面(曖昧さの解消など)に対応するためのルールです。
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント