
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
mapリテラル(Map literals)
mapリテラルでは、各要素にキーがなければならない。非定数のmapキーについては、評価順序の節を参照のこと。
解説
mapリテラルはキーが必須
この節はとても短いですが、大事なルールをひとつ述べています。mapリテラルでは、すべての要素にキーを書かなければならないということです。
配列やスライスのリテラルではキーを省略してインデックスの自動採番に任せることができましたが、mapではそれができません。考えてみれば当然で、mapのキーは連番の整数とは限らないので、自動で決めようがないですよね。
// OK:すべての要素にキーがある
m := map[string]int{
"Alice": 30,
"Bob": 25,
}
// こういう書き方はできない(キーがないとどこに入れればいいかわからない)
// m := map[string]int{30, 25} // コンパイルエラー!
「非定数のmapキー」とは
原文の後半で触れている「非定数のmapキー」とは、変数や関数呼び出しの結果をキーに使うケースのことです。
// 定数キー:コンパイル時に値が確定している
m := map[string]int{"Alice": 30}
// 非定数キー:実行時に値が決まる
name := getName()
m := map[string]int{name: 30}
非定数キーが複数あるとき、「どのキーの式から先に評価されるのか」という順序の問題が出てきます。その詳細は仕様書の「評価順序(evaluation order)」の節で説明されていますが、普段の開発で気にする場面はほとんどありません。mapリテラルのキーに副作用のある式を書かない限り、順序が結果に影響することはないからです。
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント