Go言語入門:言語仕様 -Vol.106-

スポンサーリンク
Go言語入門:言語仕様 -Vol.106- 用語解説
Go言語入門:言語仕様 -Vol.106-
この記事は約4分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

本日は、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言語の言語仕様について解説しました。

よっしー
よっしー

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

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました