定数とは、特定のデータ型を持つ不変の値です。
本記事ではGolangの定数について解説していきます。
定数(不変のものとなりうるもの)
Golangではどんなリテラルも定数です。Golangの定数には次のようなものがあります。
- 文字列(String): “Hello”
- 数値(Integer): 1234
- 浮動小数点数(Floating point): 23.56
- 真偽値(Boolean): true, false
- ルーン値(Rune): 0x0048
- 複素数(Complex): 7+6i
Goで定数を宣言する方法(const キーワード)
const キーワードは、const値(定数)を宣言するために使用します。
一度宣言すると、新しい値を割り当てることができないため、不変となります。また、constはその型も変更することができません。
package main
import "fmt"
func main() {
const name string = "Tanaka" // declaration
// const b int := 3 // ":=" は使えない
// name = "Sato" // 再代入不可なのでエラーが発生する
const p = 22/7 // 式の定数
fmt.Println(p) // prints 3
}
constは”:=”で宣言できません。
ブロックの中で複数の定数を宣言することができます。以下がそのコード例です。
const (
a int = 42
b string = "Hi"
)
Goにおける定数の型
定数には型付けがあり、型付けが与えられていない定数は、値から推測されます。
型付き定数
型付き定数は、すでに型が宣言されている定数である。以下はその例である。
package main
import (
"fmt"
)
func main() {
const test1 string = "Hello world"
fmt.Println(test1)
}
上の例では、const test1は宣言されている通りstringの型を持っています。
型が明記されてない定数
型が明記されてない定数とは、型が宣言されていないconstのことです。
以下がその例です。
package main
import (
"fmt"
)
func main() {
const test2 = 30 // bの型は宣言されてない
fmt.Println(test2)
}
上のコードでは、test2は整数リテラルですが、型が宣言されていません。
コンパイラはコンパイル時に型を推論します。よって上記の場合、test2の型はintになります。
定数表現
Golangでは、constは式を持つことができ、その式はその後評価されてconstの値になります。
式をconstとして使用する例を見てみましょう。
package main
import (
"fmt"
)
func main() {
const a = 1 + 5.4
fmt.Printf("%f (%T)\n", a, a) // prints 6.400000 (float64)
const b = 3 + 7
fmt.Printf("%d (%T)\n", b, b) // prints 10 (int)
// const c = 5 + true // error: mismatched types
}
上記のコードでは、%Tは型を表示するために使用されています。
上記の例にあるように不一致の型は使用できず、もし両方が同じ型であれば、その型に評価されます。
その式の中で型を変更するには、その式の中で明示的に型を変更して、その型を私たちの望ましい型に変換する必要があります。その方法を見てみましょう。
package main
import (
"fmt"
)
func main() {
const a = 3.14 + 8
fmt.Printf("%f (%T)\n", a, a) // 11.140000 (float64)
const b = float64(3) + 3.25 // float64に評価される
fmt.Printf("%f (%T)\n", b, b) // 6.250000 (float64)
}
Goにおけるconst(定数)の使いやすさ
constは、不変のものを宣言する必要がある場合に使用します。つまり、プログラムの途中で値が変わることはありません。
定数によって型も不変にせざるを得ないので、コードの保守性が向上します。