Go/字句的要素

Goにおける字句的要素(Lexical elements)は、プログラムを構成する基本的な要素です。 これらはプログラム内でのトークンや構造を構築するための基本的な構成要素です。
主な字句的要素は以下のようになります:
コメントは、プログラムの記録として機能します。コメントには2つの形式があります。
コメントは、ルーンや文字列リテラルの中や、コメントの中では始められません。 改行のない一般的なコメントは、スペースのように機能します。それ以外のコメントは改行のように動作します。
形式文法(formal grammar)では、多くの Production の終端にセミコロン「;」を使用します。Goプログラムでは、以下の2つのルールにより、これらのセミコロンのほとんどを省略することができます。
慣用的な使用法を反映させるために、このドキュメント(The Go Programming Language Specification)のコード例では、これらの規則に従ってセミコロンを省略しています。
識別子(Identifiers)は、変数や型などのプログラムの実体を表すものです。識別子は、1つ以上の文字と数字を組み合わせたものです。識別子の最初の文字は文字でなければなりません。
識別子の中には宣言済み識別子として、あらかじめ宣言されているものがあります。
キーワード(Keywords)
以下の文字列は、代入演算子(assignment operators)を含む演算子(operators)と区切子(punctuation)を表します。 Go1.18で新たに ~ が追加されました。
整数リテラル(An integer literal)とは、整数の定数を表す一連の数字のことです。オプションのプレフィックスは、非10進数の基数を設定します。2進法では0bまたは0B、8進法では0、0o、または0O、16進法では0xまたは0Xです。0は10進数の0とみなされます。16進数のリテラルでは、aからfまでの文字とAからFまでの文字が10から15までの値を表します。
可読性を高めるために、アンダースコア文字 _ が基本の接頭辞の後や連続する数字の間に表示されることがありますが、このようなアンダースコアはリテラルの値を変更するものではありません。
浮動小数点リテラル(A floating-point literal)とは、浮動小数点定数(a floating-point constant)を10進数または16進数で表したものです。
10進数の浮動小数点リテラルは、整数部(10進数)、小数点、分数部(10進数)、指数部(eまたはEの後に任意の符号と10進数)で構成されます。整数部または小数部のいずれかを省略することができ、小数点部または指数部のいずれかを省略することができます。指数値expは、仮数部(整数部と小数部)を10に拡大する。
16進浮動小数点リテラルは、0xまたは0Xの接頭辞、整数部(16進数)、基数点、分数部(16進数)、指数部(pまたはPの後に任意の符号と10進数)で構成されます。整数部と分数部のいずれかを省略することができます。基数点も省略できますが、指数部は必須です。(この構文は、IEEE 754-2008の§5.12.3の構文と同じです。) 指数値expは、仮数部(整数部と小数部)を2expだけ拡大したものです。
読みやすさのために、下線文字 _ が接頭辞の後や連続する数字の間に現れることがありますが、このような下線文字はリテラル値を変更するものではありません。
虚数リテラル(An imaginary literal)は、複素数定数(a complex constant)の虚数部(the imaginary part)を表します。虚数リテラルの値は、それぞれの整数または浮動小数点リテラルの値に虚数単位の i {\displaystyle i} を掛けたものになります。
ルーンリテラル(A rune literal)は、Unicodeコードポイント( a Unicode code point)を示す整数値であるルーン定数(a rune constant)を表す。ルーンリテラルは、 'x' や '\n' のように一重引用符で囲まれた1つ以上の文字で表されます。引用符の中には、改行とエスケープされていない一重引用符以外の任意の文字を入れることができます。一重引用符で囲まれた文字は、その文字自体のUnicode値を表しますが、バックスラッシュで始まる複数の文字列は、さまざまな形式の値をエンコードします。
最も単純な形式は、引用符の中の1文字を表すものです。GoのソーステキストはUTF-8でエンコードされたUnicode文字なので、UTF-8でエンコードされた複数のバイトが1つの整数値を表すことがあります。たとえば、リテラルの 'a' は、リテラルのa(Unicode U+0061、値0x61)を表す1バイトを保持し、 'ä' は、リテラルのa-dieresis(U+00E4、値0xe4)を表す2バイト(0xc3 0xa4)を保持します。
いくつかのバックスラッシュエスケープにより、任意の値をASCIIテキストとしてエンコードすることができる。整数値を数値定数として表すには4つの方法があります。\x の後に16進数の数字を2つ並べる方法、 \u の後に16進数の数字を4つ並べる方法、\U の後に16進数の数字を8つ並べる方法、そしてバックスラッシュ \ の後に8進数の数字を3つ並べる方法です。いずれの場合も、リテラルの値は、対応する基数の数字で表される値となります。
これらの表現はすべて整数になりますが、それぞれ有効な範囲が異なります。8進数エスケープは、0から255までの値を表さなければなりません。16進数のエスケープは、構造上この条件を満たします。0x10FFFF以上の値やサロゲートハーフなど、Unicodeのコードポイントを表すエスケープがあります。
バックスラッシュの後、ある1文字のエスケープは特別な値を表します。
バックスラッシュで始まる他のすべてのシーケンスは、ルーンリテラル内では違法です。
文字列リテラル(A string literal)とは、一連の文字を連結して得られる文字列定数のことです。生の文字列リテラル(Raw string literals)と解釈される文字列リテラル(Interpreted string literals)の2つの形式があります。
生の文字列リテラル(Raw string literals)は、`foo`のようにバッククォートで囲まれた文字列です。引用符の中には、バッククォート以外の任意の文字を入れることができます。生の文字列リテラルの値は、引用符の間にある解釈されていない(暗黙のうちにUTF-8にエンコードされている)文字で構成される文字列です。生の文字列リテラルに含まれるキャリッジリターン文字('\r')は、生の文字列値から削除されます。
解釈される文字列リテラル(Interpreted string literals)は、"bar" のように二重引用符で囲まれた文字列です。引用符の中には、改行とエスケープされていない二重引用符以外の任意の文字を入れることができます。引用符の間の文字はリテラルの値を形成し、バックスラッシュのエスケープはルーンリテラルの場合と同様に解釈されます(ただし、\' は違法、 \" は合法です)。3桁の8進数(\nnn)と2桁の16進数(\xnn)のエスケープは、結果として得られる文字列の個々のバイトを表します。他のすべてのエスケープは、個々の文字の(おそらく複数バイトの)UTF-8エンコーディングを表します。文字列リテラルの中では、\377と\xFFは0xFF=255の値を持つ1バイトを表し、ÿ、\u00FF、\U000000FF、\xc3\xbfは、文字U+00FFのUTF-8エンコーディングの2バイト0xc3 0xbfを表します。
これらの例はすべて同じ文字列を表しています。
ソースコードが、アクセントと文字を含む結合形式( combining form)のように、1つの文字を2つのコードポイントで表現している場合、ルーンリテラルに入れるとエラーになり(1つのコードポイントではありません)、文字列リテラルに入れると2つのコードポイントとして表示されます。