Go言語の字句要素
2026/09/20

ソースコードの表現

Go言語のソースコードはUTF-8でエンコードされたUnicodeテキストです。大文字と小文字は別の文字として区別されます。

コメント

コメントは、行コメント(//)とブロックコメント(/* */)の2種類です。入れ子にはできません。

// 行コメント(行末まで)

/*
ブロックコメント(複数行)
*/

改行を含まないブロックコメントは空白1つとして扱われます。一方、行コメントや改行を含むブロックコメントは改行として扱われます。

識別子とキーワード

識別子は、変数、関数、型、パッケージなどに付ける名前です。先頭は文字で始まり、2文字目以降には数字も使えます。文字にはUnicodeの文字とアンダースコア_が含まれます。

アンダースコア_は小文字として扱われるため、識別子の先頭に置くこともできます。先頭が小文字または_の名前はパッケージ外から参照できません。外部に公開されるのは、先頭が大文字の名前だけです。

var _count int // 先頭が_なのでパッケージ外からは見えない
var count int  // 先頭が小文字でも同様に見えない
var Count int  // 先頭が大文字なら他パッケージから見える

次の25語は構文を定義するためのキーワードであり、識別子には使えません。

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

一方、true、false、nilや型名、組み込み関数はキーワードではなく事前宣言された識別子です。キーワードとは異なり、同名の変数として再定義できてしまいます。

true := 1

// var if int = 1 // コンパイルエラー

セミコロン

Go言語の構文上、文末にはセミコロンが必要です。ただし、字句解析の段階でコンパイラがセミコロンを自動で補うため、ソースコードに;を直接書く機会はほとんどありません。

行末のトークンが次のいずれかである場合、その直後にセミコロンが自動挿入されます。

  • 識別子
  • リテラル
  • break、continue、fallthrough、return
  • ++、--、)、]、}

明示的に書いた;もそのまま解釈され、行末にあっても二重に挿入されることはありません。

また、閉じ括弧)や}の直前ではセミコロンを省略できます。改行がない1行コードでも、末尾の括弧の手前に;を書かずに済みます。

func inc(x int) int { return x + 1 }

改行を含むブロックコメントは改行として扱われるため、直前のトークン次第でセミコロンが自動挿入されます。

a = b /* 改行を含むコメントは改行扱いになる
*/ + c // コンパイルエラー: a = b; + c と解釈される

ifやforなどの制御構文では開き括弧{を次の行に置くことができません。条件式の直後で改行するとセミコロンが補われてしまい、構文エラーになります。そのため、開き括弧{は同じ行に書きます。

if x < 0 {
    return -x
}
if x < 0
{
    // コンパイルエラー: if x < 0; と解釈される
}