セミコロン
Cと同様に、Goの正式な文法では、ステートメントを終了するためにセミコロンを使用しますが、Cとは異なり、これらのセミコロンはソースに表示されません。代わりに、レクサーは簡単な規則を使用して、スキャンしながら自動的にセミコロンを挿入するため、入力テキストはほとんどそれらから解放されます。
ルールは次のとおりです。改行前の最後のトークンが識別子(int
やfloat64
などの単語を含む)、数値や文字列定数などの基本リテラル、または次のトークンのいずれかである場合:
break continue fallthrough return ++ -- ) }
レクサーは常にトークンの後にセミコロンを挿入します。これは「ステートメントを終了できるトークンの後に改行がある場合、セミコロンを挿入する」と要約できます。
セミコロンは、閉じ括弧の直前でも省略できるため、次のようなステートメント:
go func() { for { dst <- <-src } }()
にはセミコロンは必要ありません。慣用的なGoプログラムは、for
ループ節でイニシャライザ、条件、継続要素を分離するなど、セミコロンを必要とする場所にのみセミコロンがあります。また、1行に複数のステートメントを分離する場合にも必要です(そのようなコードを書く場合)。
セミコロン挿入ルールの一つの結果として、制御構造(if
、for
、switch
、select
)の開始波括弧を次の行に置くことはできません。そうすると、波括弧の前にセミコロンが挿入され、望ましくない効果を引き起こす可能性があります。次のように書いてください:
if i < f() {
g()
}
このようには書かないでください:
if i < f() // 間違い!
{ // 間違い!
g()
}