
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
一次式(Primary expressions)
一次式は、単項式および二項式のオペランドである。
PrimaryExpr = Operand |
Conversion |
MethodExpr |
PrimaryExpr Selector |
PrimaryExpr Index |
PrimaryExpr Slice |
PrimaryExpr TypeAssertion |
PrimaryExpr Arguments .
Selector = "." identifier .
Index = "[" Expression [ "," ] "]" .
Slice = "[" [ Expression ] ":" [ Expression ] "]" |
"[" [ Expression ] ":" Expression ":" Expression "]" .
TypeAssertion = "." "(" Type ")" .
Arguments = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
x
2
(s + ".txt")
f(3.1415, true)
Point{1, 2}
m["foo"]
s[i : j + 1]
obj.color
f.p[i].x()
解説
一次式ってなに?
一次式は、式の中で最も基本的な構成要素です。+ や * のような演算子で組み合わせる「部品」にあたるものですね。
たとえば a + b * c という式があったとき、a、b、c が一次式で、+ と * が演算子です。一次式はそれ単体で値を持つ、最小単位の式と考えてください。
一次式の種類
構文定義を見ると色々な種類がありますが、ひとつずつ見ていけば難しくありません。原文の例を使って整理してみましょう。
そのまま値になるもの(オペランド)
x // 変数
2 // リテラル
(s + ".txt") // 括弧で囲んだ式
Point{1, 2} // 複合リテラル
これらは前回までに学んだオペランドそのものですね。
セレクタ(Selector):. でアクセス
obj.color // obj の color フィールドにアクセス
構造体のフィールドやパッケージの識別子にアクセスするときに使う、おなじみの . です。
インデックス(Index):[] でアクセス
m["foo"] // map から "foo" キーの値を取得
配列、スライス、map の要素に [] でアクセスします。
スライス(Slice):[:] で範囲を切り出す
s[i : j + 1] // スライスの一部を切り出す
関数呼び出し(Arguments):() で呼び出す
f(3.1415, true) // 関数 f を引数つきで呼び出す
チェーンできるのがポイント
一次式の定義をよく見ると、PrimaryExpr Selector のように一次式の後ろにさらに操作を続けられる再帰的な構造になっています。これにより、操作を連鎖(チェーン)させることができます。
f.p[i].x()
この式は左から順に以下のように読めます。
f— 変数(オペランド)f.p—fのフィールドpにアクセス(セレクタ)f.p[i]— その結果のインデックスiにアクセス(インデックス)f.p[i].x— その結果のフィールドxにアクセス(セレクタ)f.p[i].x()— その結果を関数として呼び出す(引数)
こうやって .、[]、() を次々つなげて複雑な式を作れるのが、一次式の仕組みです。日常的に書いているコードも、実はこのルールに沿って組み立てられているんですね。
型アサーションと変換
構文定義の中にある残り2つも簡単に触れておきます。
型アサーション(TypeAssertion)
val := x.(int) // x が int 型であることを主張して取り出す
インターフェース型の変数から、具体的な型の値を取り出すときに使います。
変換(Conversion)
n := int(3.14) // float64 → int に変換
ある型の値を別の型に変換するときに使います。
これらの詳細は仕様書の後続の節で説明されますので、ここでは「一次式の一種として存在する」ことだけ押さえておけば大丈夫です。
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント