Go 言語の定数
Go の定数
Go で定数を宣言するには、 const キーワードを使います。
const 定数名 = 定数値
定数はある特定の値の別名として使えます。一度宣言した定数に他の値を割り当てようとしても、コンパイル時にエラーとして検出されます。
次の例では定数 M を 10 という値として宣言しています。
const M = 10
これに他の値を代入しようと試みても、コンパイル時にエラーとして検出されます。
const M = 10
M = 123 // エラー
// cannot assign to M (declared const)
この形式で宣言する定数には、型は決められていません。次のように、 int や float64 といった異なるデータ型の変数に代入できます。
package main
import "fmt"
func main() {
const M = 10
var i int = M // int に代入
var x float64 = M // float64 に代入
fmt.Printf("%v [%T]\n", i, i) // 10 [int]
fmt.Printf("%v [%T]\n", x, x) // 10 [float64]
}
複数の定数を宣言する場合には、次のようにひとつの const キーワードと () でまとめて記載することができます。
const (
M = 10
N = 123
)
Go の型付き定数
上で説明した形式の定数は「型無し定数」 (untyped constant) といいます。
一方、Go では型付き定数 (typed constant) も宣言することができます。型付き定数は次の形式で宣言します。
const 定数名 データ型 = 定数値
型付きの定数は、変数に代入する際に型のチェックが行われます。
次の例では int 型で宣言した定数 M を float64 型の変数に代入を試みていますが、コンパイル時にエラーが発生します。
const M int = 10
var i int = M // これは OK
var x float64 = M // エラー
// cannot use M (type int) as type float64 in assignment
この int 型の定数 M を float64 型の変数に代入するには、明示的なキャストが必要です。
var x float64 = float64(M)
Go の定数へ値を自動的に割当てる iota
定数に値を割り振るときに、連番を割り当てたい場合は iota を利用すると便利です。 iota を定数の宣言時に使うと、0 から順番に自動的に数値の連番を割り当てます。
次の例では定数 north、 south、 east、 west を宣言していますが、 north の宣言に iota を割当てることで、それに続く定数に連番を割り当てています。
package main
import "fmt"
const (
north = iota
south
east
west
)
func main() {
fmt.Printf("%v %v %v %v\n", north, south, east, west)
// 0 1 2 3
}
この例では northから数値の 0、1、2、3 が割り当てられていることがわかります。
もし、10 番から順に 10、11、12、13 と割り当てたい場合は、次のように iota + 10 を先頭の値として割り当てます。
const (
north = iota + 10
south
east
west
)
func main() {
fmt.Printf("%v %v %v %v\n", north, south, east, west)
// 10 11 12 13
}