Go 言語のリテラル
Go 言語のリテラルとは?
リテラル (literal) というのは、プログラミング用語でソースコードに直接記載する値のことを指します。
例えば、数値の 1 とか 3.14 とか、 あるいは文字列の "Hello" とか、そういった値のことを指します。
「定まった値だから」といって「定数」と呼んでしまうと、プログラミングの言葉では違う意味になります。 定数については「Go の定数」をご覧ください。
Go では次の5種類のリテラルが決められています。
- 整数リテラル
- 浮動小数点リテラル
- イマジナリリテラル
- ルーンリテラル
- 文字列リテラル
Go 言語の整数リテラル
Go の整数リテラルは基本的に0から9の数値から作られ、既定で10進数の整数値になります。
x := 123
fmt.Printf("%v [%T]\n", x, x)
// 123 [int]
fmt.Printf() 関数はフォーマット文字と引数を受け取り、文字を出力します。フォーマット指定子の %v は変数の既定のフォーマットで表示し、 %T は引数のデータ型を文字列で表示します。
数値が続く任意の場所に、アンダースコア _ を入れて数字を区切ることもできます。
x := 1_2_3 // 123 [int]
2進数を表す場合の接頭辞は 0bまたは0Bです。
x := 0b1100
fmt.Printf("%v [%T]\n", x, x) // 12 [int]
8進数 を表す場合の接頭辞は 0oまたは0Oです。
先頭が 0 始まりの数値は自動的に 8 進数として解釈さるので、接頭辞のアルファベットの o または O は省略可能です。
x := 0123
fmt.Printf("%v [%T]\n", x, x) // 83 [int]
16進数 を表す場合の接頭辞は 0xまたは0X です。
10進数の数値の 10 から 15 までの範囲は、アルファベットの a から f または A から F で記載します。
x := 0xBEEF
fmt.Printf("%v [%T]\n", x, x) // 48879 [int]
Go 言語の浮動小数点リテラル
小数点の付いた数字は浮動小数点リテラルになります。
x := 3.14
fmt.Printf("%v [%T]\n", x, x) // 3.14 [float64]
10の累乗は e または E に続けて冪指数を書きます。 例えば 1.23e-3 は 1.23 * 10-3 の意味になります。
x := 1.23e-3
fmt.Printf("%v [%T]\n", x, x) // 0.00123 [float64]
16進数浮動小数点は、 0x または 0X を接頭辞とし、 16進冪指数 (hex exponent) は p または P に続けて記載します。
例として、 0x1.fp3 は10進数の (1 + 15/16) * 23 と等しくなります。
x := 0x1.fp3
fmt.Printf("%v [%T]\n", x, x) // 15.5 [float64]
y := (1 + 15.0/16.0) * math.Pow(2, 3)
fmt.Printf("%v\n", y) // 15.5
Go 言語の虚数リテラル
Go の虚数リテラル (imaginary literals) は、整数リテラルまたは浮動小数点リテラルに続き、虚数単位を表す i を書きます。
デフォルトで complex128 型として認識されます。
x := 123i
fmt.Printf("%v [%T]\n", x, x) // (0+123i) [complex128]
Go 言語のルーンリテラル
Go のルーンリテラル (rune literals) は、シングルクォート ' で囲むことでひとつの文字を表します。
種類 | 表記方法 | 例 |
---|---|---|
Unicode 文字 | 'と ' で文字を囲む | 'A', '葵' |
8ビット8進数文字コード | \ に続き8進数の数値3桁 | '\101' |
8ビット16進数文字コード | \x に続き16進数の数値2桁 | '\x41' |
16ビット16進数文字コード | \u に続き16進数の数値4桁 | '\u672C' |
32ビット16進数文字コード | \U に続き16進数の数値8桁 | '\U0001F604' |
x := '\101'
y := '\x41'
fmt.Printf("%c %c\n", x, y) // A A
Go のルーンリテラルには Unicode のコードポイントをそのまま記載できます。
x := '\u672C'
y := '\U0001F604'
fmt.Printf("%c [%T]\n", x, x) // 本 [int32]
fmt.Printf("%c [%T]\n", y, y) // 😄 [int32]
次の文字はシングルクォート中で使うときに、エスケープが必要です。
エスケープ文字 | 意味 |
---|---|
\a | アラート (ベル) |
\b | バックスペース |
\f | フォームフィード |
\n | ラインフィード (ニューライン) |
\r | キャリッジリターン |
\t | 水平タブ |
\v | 垂直タブ |
\\ | バックスラッシュ |
\' | シングルクォート |
\" | ダブルクォート |
Go 言語の文字列リテラル
Go の文字列リテラルはダブルクォート " で囲んで記載します。
x := "Hello, world!"
y := "\101\102\x43"
fmt.Println(x) // Hello, world!
fmt.Println(y) // ABC
ダブルクォートではなくバッククォート ` で囲むと複数行に渡って文字を記述できます。
x := `Hello,
World!`
fmt.Println(x)
// Hello,
// World!
ただし、この場合文字コードの記述を含めて、エスケープシーケンスが必要な文字は使えません。もしバッククォートによる文字列リテラルに、 エスケープシーケンスを記述すると (文字に変換されず) そのままの文字が出力されます。
x := `Hello, world!
\101\102\x43`
fmt.Println(x)
// Hello, world!
// \101\102\x43
以上、ここでは Go で使用できるリテラルについて説明しました。