
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
インクリメント・デクリメント文(IncDec statements)
++ および -- 文は、オペランドを型なし定数 1 だけ増加または減少させる。代入と同様に、オペランドはアドレス指定可能であるか、mapのインデックス式でなければならない。
IncDecStmt = Expression ( "++" | "--" ) .
以下の代入文と意味的に等価である:
インクリメント/デクリメント文 代入文
x++ x += 1
x-- x -= 1
解説
++ と -- の基本
x++ は x を1増やし、x-- は x を1減らします。
x := 10
x++ // x は 11 になる
x-- // x は 10 に戻る
Go の ++ / -- は「文」であって「式」ではない
これは以前も触れましたが、非常に重要なポイントなので改めて強調します。
// C言語では OK だが、Go ではすべてコンパイルエラー
y := x++ // ❌ x++ は値を返さない
fmt.Println(x++) // ❌
if x++ > 0 {} // ❌
Go ではこう書きます。
x++
y := x // 別の文として書く
また、Go には前置の ++ / -- もありません。
++x // ❌ コンパイルエラー! Go には前置インクリメントがない
x++ // ✅ 後置のみ
型なし定数 1 で加算される
原文の「型なし定数 1」という表現がポイントです。1 は型なし定数なので、どんな数値型にも自然に適用できます。
var i int = 10
i++ // OK: int に 1 を加算
var f float64 = 3.14
f++ // OK: float64 に 1.0 を加算 → 4.14
var c complex128 = 1 + 2i
c++ // OK: complex128 に 1 を加算 → 2 + 2i
アドレス指定可能でなければならない
++ や -- のオペランドは、代入の左辺に置けるものでなければなりません。
x := 10
x++ // ✅ 変数
s := []int{1, 2, 3}
s[0]++ // ✅ スライスのインデックス
m := map[string]int{"a": 1}
m["a"]++ // ✅ mapのインデックス
// 以下はダメ
42++ // ❌ リテラル
getVal()++ // ❌ 関数の戻り値
mapのインデックスに ++ が使えるのは便利です。カウンターの実装でよく使われるパターンですね。
// 文字の出現回数をカウント
counter := make(map[rune]int)
for _, ch := range "hello" {
counter[ch]++ // 存在しないキーはゼロ値(0)から始まる
}
// counter = {'h':1, 'e':1, 'l':2, 'o':1}
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント