定数(const)

定数は、コンパイルしてから値が変わらないデータを記憶する領域です。

定数の宣言方法

定数はキーワードconstを使って宣言します。 varと同じ要領で宣言しますが、宣言と代入を一緒にする必要があります。 定数では、型のない定数と型のある定数を宣言できます。

型のない定数を宣言します。

// 形式: var 定数名 = 定数
const n1 = 1

型のある定数を宣言します。

// 形式: var 定数名 型 = 定数
const n1 int = 1

型のない定数

Goの定数は基本的に型のない定数を使います。

型のない定数は任意の精度を表現できる点で優れています。 たとえば、int64型の表現可能な範囲は-9223372036854775808から9223372036854775807です。 対して、型がない定数はこのような制限がありません。

ただし、型がない定数であっても、型が必要なタイミングで型が付与されます。 このときに型の範囲を超えている場合、コンパイラがエラーで知らせてくれるので修正しましょう。

次のサンプルでは、fmt.Println関数に定数を指定した際にint型が付与されます。

// 型がないので、高精度で表現できる
const n1 = 10000000000000000000 - 9999999999999999999
const n2 = 10000000000000000000
// 値を関数に引き渡すタイミングで型が付与される(int型)
// ただし、int型の範囲を超えるため、コンパイルエラー
// fmt.Println(n2)

型のない定数の特徴をまとめると次の通りです。

  • 任意の精度で表現できる(オーバーフローしない)
  • 必要なタイミングで型付けされる(その型の範囲を超えるとコンパイルエラー)

識別子iota

事前に宣言された識別子iotaを使うと、連番を振ることができます。 他のプログラミング言語の列挙型に似ています。

識別子iotaは整数です。最初は0で、使用のたびに1ずつ足されていきます。

const (
    sunday    = iota // 0
    monday    = iota // 1
    tuesday   = iota // 2
    wednesday = iota // 3
    thursday  = iota // 4
    friday    = iota // 5
    saturday  = iota // 6
)

2つ目以降の定数は代入を省略できます。

const (
    sunday    = iota // 0
    monday           // 1
    tuesday          // 2
    wednesday        // 3
    thursday         // 4
    friday           // 5
    saturday         // 6
)

識別子iotaを使うと0から始まりますが、別の値にしたい場合は、次のようにします。

const (
    sunday    = iota + 10 // 10
    monday                // 11
    tuesday               // 12
    wednesday             // 13
    thursday              // 14
    friday                // 15
    saturday              // 16
)

識別子iotaにはどんな使い道があるでしょうか。 先ほどのサンプルで示した曜日は7種類の選択肢といえます。 このような限定された選択肢を扱う際に識別子iotaが使えます。 特に以降のページで説明する分岐処理と組み合わせて使われることが多いです。 先ほどのサンプルでいえば、月曜と水曜の場合に割引価格を適用するといった処理です。