Go言語の字句要素
2026/07/28

ソースコードの表現

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

コメント

コメントは、行コメント(//から行末まで)とブロックコメント(/*から*/まで)の2種類です。

// 行コメント

/*
ブロックコメント
*/

トップレベル宣言の直前に改行なしで置かれたコメントは、その宣言のドキュメントとみなされます。

// Add はaとbの和を返す。
func Add(a, b int) int {
    return a + b
}

識別子とキーワード

識別子は、変数・関数・型・パッケージなどに付ける名前です。文字で始まり、文字と数字からなります。アンダースコア_は、仕様上「小文字の文字」として扱われます。そのため識別子の先頭にも使え、先頭が_の名前は小文字始まりと同じく他パッケージからは見えません(公開されるのは先頭がUnicodeの大文字のときだけです)。

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

次の語はキーワードであり、識別子には使えません。

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

セミコロンの自動挿入

文法上、Goの文はセミコロンで終わります。字句解析は、コンパイラがソース文字列をif:=などのトークンに分ける処理です。この段階で次のトークンの直後に改行やEOFがあればセミコロンを補うため、ソースに;を書く必要はほとんどありません。ソースに;を書いた場合もそれはセミコロンのトークンとして読まれ、行末が;の行では自動挿入は走らないため、二重にはなりません。

次のトークンの直後の改行でセミコロンが入ります。

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

if条件式の直後で改行すると、行頭の{の前にセミコロンが入ったと解釈されコンパイルエラーになります。制御構文の{は同じ行に書きます。

if x < 0 {
    return -x
}
if x < 0
{
    // コンパイルエラー
}