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-31.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 で使用できるリテラルについて説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Go 言語入門