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

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

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

本日は、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, uppercaseLu大文字A, B, Z, Α
Letter, lowercaseLl小文字a, b, z, α
Letter, titlecaseLtタイトルケースDž, Lj, Nj
Letter, modifierLm修飾文字ʰ, ʲ, ˀ
Letter, otherLoその他の文字あ, 漢, ア, 한
Number, decimal digitNd10進数字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コンパイラが対応していれば使えます。ただし、識別子には使えるものと使えないものがあるので、英数字と日本語を中心に使うのが無難です。

まとめ: 文字分類で覚えておくべきこと

  1. 改行(newline) → 特別扱い、文の区切りになる
  2. unicode_char → 改行以外のすべての文字、文字列やコメントに使える
  3. unicode_letter → 識別子に使える「文字」、英語、日本語、ギリシャ文字など
  4. 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言語の言語仕様について解説しました。

よっしー
よっしー

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

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

コメント

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