
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
Characters(文字)
以下の用語は、特定のUnicode文字カテゴリを示すために使用されます。
newline = /* Unicodeコードポイント U+000A */ .
unicode_char = /* 改行を除く任意のUnicodeコードポイント */ .
unicode_letter = /* "Letter"(文字)に分類されるUnicodeコードポイント */ .
unicode_digit = /* "Number, decimal digit"(数字、10進数)に分類されるUnicodeコードポイント */ .
Unicode標準8.0のセクション4.5「一般カテゴリ」では、文字カテゴリのセットが定義されています。Goは、文字カテゴリLu、Ll、Lt、Lm、またはLoのいずれかに含まれるすべての文字をUnicode文字として扱い、数字カテゴリNdに含まれる文字をUnicode数字として扱います。
解説
文字の種類を分類する
Go言語では、ソースコードに使える文字を明確に定義しています。この章では、「どんな文字が使えるのか」をUnicodeのカテゴリに基づいて説明しています。
たとえ話: 図書館で本を分類するとき、「小説」「ビジネス書」「技術書」などのカテゴリに分けますよね。同じように、Unicodeも世界中の文字を「文字(Letter)」「数字(Number)」「記号(Symbol)」などのカテゴリに分類しています。
4つの基本的な文字分類
1. newline(改行)
改行は、U+000Aという特定のコードポイントです。これは一般的に\nと表記されます。
package main
import "fmt"
func main() {
fmt.Println("1行目\n2行目") // \nで改行
// 出力:
// 1行目
// 2行目
}
特徴:
- 改行は特別扱いされます
- プログラムの中で「次の行に移る」という意味を持つ
- 文(statement)の終わりを判断するのにも使われる
// Goでは改行が文の区切りになることがある
x := 1
y := 2 // 改行があるので別の文として扱われる
2. unicode_char(改行以外の任意のUnicode文字)
unicode_charは、改行を除くすべてのUnicode文字を指します。つまり、世界中のほぼすべての文字が含まれます。
package main
import "fmt"
func main() {
// 英語
name1 := "Alice"
// 日本語
name2 := "太郎"
// 中国語
name3 := "小明"
// アラビア語
name4 := "أحمد"
// 絵文字
emoji := "😀🎉"
fmt.Println(name1, name2, name3, name4, emoji)
}
実用上の意味:
- 文字列リテラル(“”で囲まれた部分)には、改行以外のほぼすべての文字が使える
- コメントにも自由に多言語を使える
// これは日本語のコメントです
/* 複数行の
日本語コメントも
問題ありません */
3. unicode_letter(Unicode文字)
unicode_letterは、Unicodeで「文字(Letter)」として分類されるものです。具体的には以下のカテゴリが含まれます:
- Lu (Letter, uppercase): 大文字 –
A,B,C,Α(ギリシャ文字アルファ大文字) - Ll (Letter, lowercase): 小文字 –
a,b,c,α(ギリシャ文字アルファ小文字) - Lt (Letter, titlecase): タイトルケース –
Dž(特殊な文字) - Lm (Letter, modifier): 修飾文字 –
ʰ(上付き文字など) - Lo (Letter, other): その他の文字 –
あ,漢,ア,한(ハングル)
どこで使われる?
変数名、関数名、型名などの識別子(identifier) に使えます。
package main
import "fmt"
func main() {
// 英語の識別子
userName := "Alice"
// 日本語の識別子
名前 := "太郎"
年齢 := 25
// ギリシャ文字の識別子(数学でよく使う)
π := 3.14159
Δ := 0.01
fmt.Println(userName, 名前, 年齢, π, Δ)
}
重要な注意点: 識別子の最初の文字は必ずunicode_letterか_(アンダースコア)でなければなりません。数字から始めることはできません。
// 正しい例
var name1 string
var _temp int
var 名前 string
// 間違った例
var 1name string // エラー! 数字から始められない
4. unicode_digit(Unicode数字)
unicode_digitは、Unicodeで「10進数の数字(Number, decimal digit)」として分類されるものです。カテゴリNdが該当します。
含まれるもの:
- アラビア数字:
0,1,2, …,9 - アラビア・インド数字:
٠,١,٢, …,٩ - デーヴァナーガリー数字:
०,१,२, …,९ - 全角数字:
0,1,2, …,9
どこで使われる?
識別子の2文字目以降に使えます。
package main
func main() {
// 正しい例
var name1 string // 英字 + 数字
var 変数2 int // 日本語 + 数字
var test123 int // 複数の数字もOK
// 間違った例
// var 1name string // エラー! 数字から始められない
}
注意: 全角数字も使えますが、通常は半角数字を使うのが一般的です。
var test1 int // 推奨(半角)
var test1 int // 使えるが非推奨(全角)
Unicodeカテゴリの分類表
Goが認識する主な文字カテゴリをまとめると:
| カテゴリ | 略称 | 説明 | 例 |
|---|---|---|---|
| Letter, uppercase | Lu | 大文字 | A, B, Z, Α |
| Letter, lowercase | Ll | 小文字 | a, b, z, α |
| Letter, titlecase | Lt | タイトルケース | Dž, Lj, Nj |
| Letter, modifier | Lm | 修飾文字 | ʰ, ʲ, ˀ |
| Letter, other | Lo | その他の文字 | あ, 漢, ア, 한 |
| Number, decimal digit | Nd | 10進数字 | 0-9, ٠-٩, ०-९ |
実例で理解しよう
識別子に使える文字の組み合わせ
package main
import "fmt"
func main() {
// すべて正しい識別子
var userName string = "Alice" // 英字のみ
var user_name string = "Bob" // 英字 + アンダースコア
var userName2 string = "Charlie" // 英字 + 数字
var 利用者名 string = "太郎" // 日本語
var 利用者名2 string = "花子" // 日本語 + 数字
var αβγ float64 = 1.23 // ギリシャ文字
var _temp int = 42 // アンダースコアで始まる
fmt.Println(userName, user_name, userName2)
fmt.Println(利用者名, 利用者名2, αβγ, _temp)
}
使えない識別子の例
package main
func main() {
// これらはすべてコンパイルエラー
// var 123name string // 数字から始められない
// var user-name string // ハイフンは識別子に使えない
// var user name string // スペースは使えない
// var user@name string // 記号(@)は使えない
// var for int // キーワード(予約語)は使えない
}
Unicode標準8.0について
仕様書では「Unicode標準8.0」と書かれていますが、これはGoが参照しているUnicode仕様のバージョンです。現在のUnicodeはさらに新しいバージョンになっていますが、基本的な文字分類は変わっていません。
実用上の影響: 新しい絵文字や文字が追加されても、Goコンパイラが対応していれば使えます。ただし、識別子には使えるものと使えないものがあるので、英数字と日本語を中心に使うのが無難です。
まとめ: 文字分類で覚えておくべきこと
- 改行(newline) → 特別扱い、文の区切りになる
- unicode_char → 改行以外のすべての文字、文字列やコメントに使える
- unicode_letter → 識別子に使える「文字」、英語、日本語、ギリシャ文字など
- unicode_digit → 識別子の2文字目以降に使える「数字」、0-9など
実用的なアドバイス:
- 変数名は英数字+アンダースコアが最も互換性が高い
- 日本語の変数名も使えるが、チーム開発では事前に合意が必要
- ギリシャ文字(π、Δなど)は数学的なコードで便利
- 絵文字は識別子には使えないので、文字列やコメントでのみ使おう
// 実用的な命名例
var userName string // 推奨: 英語のキャメルケース
var user_name string // 推奨: スネークケース
var 利用者名 string // OK: 日本語も使える
var π float64 = 3.14 // OK: 数学記号
var emoji = "🎉" // OK: 絵文字は文字列として使う
Goの文字分類は柔軟で国際化に対応していますが、可読性とチームの規約を優先して命名しましょう!
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント