定数(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
が使えます。
特に以降のページで説明する分岐処理と組み合わせて使われることが多いです。
先ほどのサンプルでいえば、月曜と水曜の場合に割引価格を適用するといった処理です。