字句要素
コメント
コメントはプログラムのドキュメントとして機能します。2つの形式があります:
- 行コメントは文字シーケンス
//
で始まり、行の終わりで終了します。 - 一般コメントは文字シーケンス
/*
で始まり、最初の後続文字シーケンス*/
で終了します。
コメントはルーンまたは文字列リテラルの内部、またはコメントの内部から始めることはできません。改行を含まない一般コメントはスペースのように動作します。その他のコメントは改行のように動作します。
トークン
トークンはGo言語の語彙を形成します。4つのクラスがあります:識別子、キーワード、演算子と句読点、およびリテラル。スペース(U+0020)、水平タブ(U+0009)、キャリッジリターン(U+000D)、改行(U+000A)から形成される空白は、それらが結合して単一のトークンになるようなトークンを分離する場合を除いて無視されます。また、改行またはファイルの終わりはセミコロンの挿入をトリガーすることがあります。入力をトークンに分割する際、次のトークンは有効なトークンを形成する最長の文字シーケンスです。
セミコロン
形式構文では、いくつかのプロダクションでセミコロン ;
を終端として使用しています。Goプログラムでは、以下の2つのルールを使用して、これらのセミコロンのほとんどを省略することができます:
入力がトークンに分割されるとき、そのトークンが以下のいずれかである場合、行の最後のトークンの直後にセミコロンがトークンストリームに自動的に挿入されます:
複雑な文が単一の行を占めることを可能にするために、閉じる
)
または}
の前のセミコロンは省略することができます。
慣用的な使用法を反映するために、このドキュメントのコード例ではこれらのルールを使用してセミコロンを省略しています。
識別子
識別子は変数や型などのプログラムエンティティに名前を付けます。識別子は1つ以上の文字と数字のシーケンスです。識別子の最初の文字は文字でなければなりません。
identifier = letter { letter | unicode_digit } .
a
_x9
ThisVariableIsExported
αβ
一部の識別子は事前宣言されています。
キーワード
以下のキーワードは予約されており、識別子として使用することはできません。
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 1.18]:
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^= ~
整数リテラル
整数リテラルは整数定数を表す数字のシーケンスです。オプションの接頭辞は10進数以外の基数を設定します:バイナリには0b
または0B
、8進数には0
、0o
、または0O
、16進数には0x
または0X
を使用します [Go 1.13]。単一の0
は10進数のゼロと見なされます。16進数リテラルでは、文字a
からf
およびA
からF
は値10から15を表します。
読みやすさのために、アンダースコア文字_
は基数接頭辞の後や連続する数字の間に表示することができます。このようなアンダースコアはリテラルの値を変更しません。
int_lit = decimal_lit | binary_lit | octal_lit | hex_lit .
decimal_lit = "0" | ( "1" … "9" ) [ [ "_" ] decimal_digits ] .
binary_lit = "0" ( "b" | "B" ) [ "_" ] binary_digits .
octal_lit = "0" [ "o" | "O" ] [ "_" ] octal_digits .
hex_lit = "0" ( "x" | "X" ) [ "_" ] hex_digits .
decimal_digits = decimal_digit { [ "_" ] decimal_digit } .
binary_digits = binary_digit { [ "_" ] binary_digit } .
octal_digits = octal_digit { [ "_" ] octal_digit } .
hex_digits = hex_digit { [ "_" ] hex_digit } .
42
4_2
0600
0_600
0o600
0O600 // 2番目の文字は大文字の「O」
0xBadFace
0xBad_Face
0x_67_7a_2f_cc_40_c6
170141183460469231731687303715884105727
170_141183_460469_231731_687303_715884_105727
_42 // 整数リテラルではなく識別子
42_ // 無効:_は連続する数字を分離する必要がある
4__2 // 無効:一度に_は1つだけ
0_xBadFace // 無効:_は連続する数字を分離する必要がある
浮動小数点リテラル
浮動小数点リテラルは浮動小数点定数の10進数または16進数表現です。
10進浮動小数点リテラルは整数部(10進数字)、小数点、小数部(10進数字)、および指数部(e
またはE
の後に任意の符号と10進数字が続く)から構成されます。整数部または小数部のいずれかを省略することができます。小数点または指数部のいずれかを省略することもできます。指数値expは仮数(整数部と小数部)を10exp倍します。
16進浮動小数点リテラルは0x
または0X
接頭辞、整数部(16進数字)、基数点、小数部(16進数字)、および指数部(p
またはP
の後に任意の符号と10進数字が続く)から構成されます。整数部または小数部のいずれかを省略することができます。基数点も同様に省略することができますが、指数部は必須です。(この構文はIEEE 754-2008 §5.12.3に記載されているものと一致します。)指数値expは仮数(整数部と小数部)を2exp倍します [Go 1.13]。
読みやすさのために、アンダースコア文字_
は基数接頭辞の後や連続する数字の間に表示することができます。このようなアンダースコアはリテラル値を変更しません。
float_lit = decimal_float_lit | hex_float_lit .
decimal_float_lit = decimal_digits "." [ decimal_digits ] [ decimal_exponent ] |
decimal_digits decimal_exponent |
"." decimal_digits [ decimal_exponent ] .
decimal_exponent = ( "e" | "E" ) [ "+" | "-" ] decimal_digits .
hex_float_lit = "0" ( "x" | "X" ) hex_mantissa hex_exponent .
hex_mantissa = [ "_" ] hex_digits "." [ hex_digits ] |
[ "_" ] hex_digits |
"." hex_digits .
hex_exponent = ( "p" | "P" ) [ "+" | "-" ] decimal_digits .
0.
72.40
072.40 // == 72.40
2.71828
1.e+0
6.67428e-11
1E6
.25
.12345E+5
1_5. // == 15.0
0.15e+0_2 // == 15.0
0x1p-2 // == 0.25
0x2.p10 // == 2048.0
0x1.Fp+0 // == 1.9375
0X.8p-0 // == 0.5
0X_1FFFP-16 // == 0.1249847412109375
0x15e-2 // == 0x15e - 2 (整数の減算)
0x.p1 // 無効:仮数に数字がない
1p-2 // 無効:p指数は16進数の仮数が必要
0x1.5e-2 // 無効:16進数の仮数はp指数が必要
1_.5 // 無効:_は連続する数字を分離する必要がある
1._5 // 無効:_は連続する数字を分離する必要がある
1.5_e1 // 無効:_は連続する数字を分離する必要がある
1.5e_1 // 無効:_は連続する数字を分離する必要がある
1.5e1_ // 無効:_は連続する数字を分離する必要がある
虚数リテラル
虚数リテラルは複素数定数の虚数部を表します。これは整数または浮動小数点リテラルの後に小文字i
が続くものです。虚数リテラルの値は、対応する整数または浮動小数点リテラルの値に虚数単位iを掛けた値です [Go 1.13]。
imaginary_lit = (decimal_digits | int_lit | float_lit) "i" .
後方互換性のために、完全に10進数(およびアンダースコア)のみで構成される虚数リテラルの整数部は、先頭に0
があっても10進整数と見なされます。
0i
0123i // 後方互換性のために == 123i
0o123i // == 0o123 * 1i == 83i
0xabci // == 0xabc * 1i == 2748i
0.i
2.71828i
1.e+0i
6.67428e-11i
1E6i
.25i
.12345E+5i
0x1p-2i // == 0x1p-2 * 1i == 0.25i
ルーンリテラル
ルーンリテラルは、Unicodeコードポイントを識別する整数値であるルーン定数を表します。ルーンリテラルは、'x'
や'\n'
のように、一重引用符で囲まれた1つ以上の文字として表現されます。引用符の中には、改行とエスケープされていない一重引用符を除く任意の文字が表示できます。一重引用符で囲まれた単一の文字は文字自体のUnicode値を表し、バックスラッシュで始まる複数文字のシーケンスはさまざまな形式で値をエンコードします。
最も単純な形式は引用符内の単一の文字を表します。Goのソーステキストは UTF-8 でエンコードされた Unicode 文字であるため、複数の UTF-8 エンコードされたバイトが単一の整数値を表す場合があります。例えば、リテラル'a'
はリテラルa
(Unicode U+0061、値0x61
)を表す単一のバイトを保持しますが、'ä'
は2バイト(0xc3
0xa4
)を保持し、a-ダイエレシス(U+00E4、値0xe4
)を表します。
いくつかのバックスラッシュエスケープにより、任意の値をASCIIテキストとしてエンコードすることができます。数値定数として整数値を表す方法は4つあります:\x
の後に正確に2桁の16進数が続くもの、\u
の後に正確に4桁の16進数が続くもの、\U
の後に正確に8桁の16進数が続くもの、そして単純なバックスラッシュ\
の後に正確に3桁の8進数が続くものです。いずれの場合も、リテラルの値は対応する基数で表される数字の値です。
これらの表現はすべて整数になりますが、有効範囲が異なります。8進エスケープは0から255までの値を表す必要があります。16進エスケープはこの条件を構成によって満たします。エスケープ\u
と\U
はUnicodeコードポイントを表すため、その中のいくつかの値は不正です。特に0x10FFFF
を超える値とサロゲートハーフは不正です。
バックスラッシュの後、特定の単一文字エスケープは特別な値を表します:
\a U+0007 アラートまたはベル
\b U+0008 バックスペース
\f U+000C フォームフィード
\n U+000A ラインフィードまたは改行
\r U+000D キャリッジリターン
\t U+0009 水平タブ
\v U+000B 垂直タブ
\\ U+005C バックスラッシュ
\' U+0027 一重引用符(ルーンリテラル内のみで有効なエスケープ)
\" U+0022 二重引用符(文字列リテラル内のみで有効なエスケープ)
ルーンリテラル内のバックスラッシュの後に認識されない文字が続くことは不正です。
rune_lit = "'" ( unicode_value | byte_value ) "'" .
unicode_value = unicode_char | little_u_value | big_u_value | escaped_char .
byte_value = octal_byte_value | hex_byte_value .
octal_byte_value = `\` octal_digit octal_digit octal_digit .
hex_byte_value = `\` "x" hex_digit hex_digit .
little_u_value = `\` "u" hex_digit hex_digit hex_digit hex_digit .
big_u_value = `\` "U" hex_digit hex_digit hex_digit hex_digit
hex_digit hex_digit hex_digit hex_digit .
escaped_char = `\` ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | `\` | "'" | `"` ) .
'a'
'ä'
'本'
'\t'
'\000'
'\007'
'\377'
'\x07'
'\xff'
'\u12e4'
'\U00101234'
'\'' // 一重引用符文字を含むルーンリテラル
'aa' // 不正:文字が多すぎる
'\k' // 不正:kはバックスラッシュの後に認識されない
'\xa' // 不正:16進数の桁が少なすぎる
'\0' // 不正:8進数の桁が少なすぎる
'\400' // 不正:8進数の値が255を超えている
'\uDFFF' // 不正:サロゲートハーフ
'\U00110000' // 不正:無効なUnicodeコードポイント
文字列リテラル
文字列リテラルは、一連の文字を連結して得られる文字列定数を表します。生文字列リテラルと解釈付き文字列リテラルの2つの形式があります。
生文字列リテラルはバッククォート間の文字シーケンスで、foo
のようなものです。引用符の間には、バッククォートを除く任意の文字が表示できます。生文字列リテラルの値は、引用符の間の解釈されていない(暗黙的にUTF-8でエンコードされた)文字で構成される文字列です。特にバックスラッシュには特別な意味はなく、文字列には改行を含めることができます。生文字列リテラル内のキャリッジリターン文字(’\r’)は生の文字列値から破棄されます。
解釈付き文字列リテラルは、"bar"
のように、二重引用符間の文字シーケンスです。引用符の間には、改行とエスケープされていない二重引用符を除く任意の文字が表示できます。引用符の間のテキストはリテラルの値を形成し、バックスラッシュエスケープはルーンリテラルと同様に解釈されます(ただし、\'
は不正で\"
は合法です)。3桁の8進数(\
nnn)と2桁の16進数(\x
nn)エスケープは、結果の文字列の個々のバイトを表します。他のすべてのエスケープは個々の文字のUTF-8エンコード(複数バイトの場合もあり)を表します。したがって、文字列リテラル内では\377
と\xFF
は値0xFF
=255の単一バイトを表しますが、ÿ
、\u00FF
、\U000000FF
、\xc3\xbf
は文字U+00FFのUTF-8エンコードの2バイト0xc3
0xbf
を表します。
string_lit = raw_string_lit | interpreted_string_lit .
raw_string_lit = "`" { unicode_char | newline } "`" .
interpreted_string_lit = `"` { unicode_value | byte_value } `"` .
`abc` // "abc"と同じ
`\n
\n` // "\\n\n\\n"と同じ
"\n"
"\"" // `"`と同じ
"Hello, world!\n"
"日本語"
"\u65e5本\U00008a9e"
"\xff\u00FF"
"\uD800" // 不正:サロゲートハーフ
"\U00110000" // 不正:無効なUnicodeコードポイント
これらの例はすべて同じ文字列を表します:
"日本語" // UTF-8入力テキスト
`日本語` // 生リテラルとしてのUTF-8入力テキスト
"\u65e5\u672c\u8a9e" // 明示的なUnicodeコードポイント
"\U000065e5\U0000672c\U00008a9e" // 明示的なUnicodeコードポイント
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" // 明示的なUTF-8バイト
ソースコードがアクセントと文字を含む合成形式のように、文字を2つのコードポイントとして表す場合、ルーンリテラルに配置すると(単一のコードポイントではないため)エラーになり、文字列リテラルに配置すると2つのコードポイントとして表示されます。