定数を使おう
値が変わらないデータには const を使って定数として定義できます。定数と変数の違い、定数を使う場面を学びます。
定数とは
これまでのレッスンでは、var や := を使って変数を宣言しました。変数は後から値を変更できましたが、プログラムの中には一度決めたら変わらない値もあります。そのような値には定数を使います。
package main
import "fmt"
func main() {
const greeting = "こんにちは"
fmt.Println(greeting) // => こんにちは
}
定数は const キーワードで宣言します。変数と同じように名前をつけてデータを保存できますが、後から値を変更できないという違いがあります。
const で定数を宣言する
const の基本構文は次のとおりです。
const 定数名 = 値
文字列や数値の定数を宣言してみましょう。
package main
import "fmt"
func main() {
const language = "Go"
const year = 2009
fmt.Println(language) // => Go
fmt.Println(year) // => 2009
}
右辺の値から Go が型を自動的に判断するため、型を書く必要はありません。
定数は宣言と同時に値を指定する必要があります。 変数のように宣言だけして後から値を入れることはできません。これは、Go の定数はプログラムのコンパイル時に値が確定している必要があるためです。
package main
func main() {
const message // 値を指定していない
} // => コンパイルエラー: missing init expr for message
型を明示して定数を宣言することもできます。
package main
import "fmt"
func main() {
const name string = "Go"
fmt.Println(name) // => Go
}ただし、型を省略する書き方のほうが一般的です。
定数と変数の違い
定数と変数の最大の違いは、後から値を変更できるかどうかです。
前のレッスンで学んだように、変数は後から値を上書きできます。
package main
import "fmt"
func main() {
color := "赤"
color = "青" // 変数は上書きできる
fmt.Println(color) // => 青
}
一方、定数に再代入しようとするとコンパイルエラーになります。
package main
func main() {
const color = "赤"
color = "青" // 定数に再代入しようとしている
} // => コンパイルエラー: cannot assign to color (neither addressable nor a map index expression)
このエラーのおかげで、変わってはいけない値がうっかり変更されるのを防ぐことができます。
定数を使う場面
プログラムの中には、変更されることのない固定の値があります。例えば、税率や上限値のように、プログラム全体で同じ値を使い続けるものです。
package main
import "fmt"
func main() {
const taxRate = 10
const maxRetry = 3
fmt.Println(taxRate) // => 10
fmt.Println(maxRetry) // => 3
}
このような固定値を定数にしておくと、次のような利点があります。
- 値の意味が名前から分かりやすくなる
- うっかり値を変更してしまうミスを防げる
const は var と同様に、関数の外(パッケージレベル)でも使えます。
package main
import "fmt"
const appName = "Codize" // 関数の外で宣言
func main() {
fmt.Println(appName) // => Codize
}まとめ
- 定数は一度決めたら値を変更できないデータ
const 定数名 = 値で定数を宣言する- 定数は宣言と同時に値を指定する必要がある
- 定数に再代入しようとするとコンパイルエラーになる
- プログラム中で変わらない固定の値を定義するときに
constを使う constは関数の中でも外(パッケージレベル)でも使える
演習に挑戦