この記事では、Go言語の定数constについて、基本からしっかり解説していきます。
プログラミングをしていると、「この値、途中で変わったら困るんだよな〜」って思うこと、ありませんか?
そんな時に活躍するのが定数`const`なんです。この記事を読めば、`const`の基本的な使い方から、変数`var`との使い分け、ちょっとした注意点まで、まるっと理解できちゃいます。
この記事で学べること
- Go言語の定数`const`って何? なぜ必要なの?
- `const`の基本的な書き方
- 型を指定したり、省略したりする方法
- 実際のプログラムでの`const`の使い方サンプル
- 変数`var`との明確な違い
- `const`を使うときに気をつけること
Go言語における定数`const`とは?
プログラミングをしていると、円周率(3.14...)みたいに「絶対に変わらない値」や、消費税率みたいに「プログラムの実行中に変えたくない値」が出てきますよね。
もし、こういう値を普通の変数(`var`で宣言するもの)に入れてしまうと、うっかり別の値で上書きしちゃうかもしれません。そうなると、計算結果がおかしくなったり、予期せぬバグが生まれたり…考えただけでもゾッとします。
そこで登場するのが定数`const`です! `const`で宣言した値は、プログラムの途中で絶対に書き換えることができません。
もう一つのメリットは、プログラムが読みやすくなることです。例えば、コードの中にいきなり `1.08` という数字が出てきたら、「これって何の数字だっけ?」ってなりがちですよね。でも、`const TaxRate = 1.08` みたいに名前をつけておけば、「ああ、これは税率なんだな」って一目でわかります。こういう「意味不明な数字(マジックナンバーって呼ばれたりします)」を減らせるのも、`const`の良いところなんです。
まとめると、`const`は
- 値を間違って書き換えるのを防いでくれる
- プログラムの意図を分かりやすくしてくれる
という、プログラムの安全性を高め、読みやすくするための仕組みというわけですね。
Go言語の定数`const`の基本的な書き方(宣言方法)
じゃあ、実際に`const`をどうやって書くのか見ていきましょう。とってもシンプルですよ。
基本形は `const 定数名 = 値` です。
例えば、円周率を`Pi`という名前で定数にしてみましょう。
package main import "fmt" func main() { const Pi = 3.14159 fmt.Println(Pi) }
簡単ですよね!
複数の定数をまとめて宣言することもできます。その場合は、`const`キーワードの後にカッコ `()` を使います。
package main import "fmt" func main() { const ( AppName = "My Awesome App" Version = "1.0.0" MaxConnections = 10 ) fmt.Println(AppName) fmt.Println(Version) fmt.Println(MaxConnections) }
こんなふうに書くと、関連する定数がまとまって見やすくなりますね。
型を指定して定数を宣言する
定数を宣言するとき、その値がどんな種類(型)なのかをはっきりさせたい場合があります。そんなときは、定数名の後に型を書きます。
書き方は `const 定数名 型 = 値` です。
package main import "fmt" func main() { const Greeting string = "Hello, Go!" // 文字列型(string)を指定 const MaxScore int = 100 // 整数型(int)を指定 const Gravity float64 = 9.8 // 浮動小数点数型(float64)を指定 fmt.Println(Greeting) fmt.Println(MaxScore) fmt.Println(Gravity) // 型が違う変数には代入できない(例) // var score int // score = Gravity // これはエラーになる! }
このように型を指定しておくと、その定数がどんな種類のデータなのかが明確になります。プログラムが大きくなってきたときや、他の人がコードを読むときに、とても分かりやすくなりますよ。
型を省略して定数を宣言する(型推論)
Go言語は賢いので、多くの場合、代入する値から定数の型を自動で判断してくれます。これを型推論と呼びます。
なので、さっきの例みたいにわざわざ型を書かなくても、`const Pi = 3.14159` のように書けば、Go言語が「ふむふむ、これは小数点が付いてるから浮動小数点数だな」って感じで、いい感じに型を決めてくれるんです。
package main import "fmt" import "reflect" // 型を調べるためにreflectパッケージを使います func main() { const Answer = 42 // Goが整数型(int)だと推論してくれる const Question = "Life?" // Goが文字列型(string)だと推論してくれる const Pi = 3.14 // Goが浮動小数点数型(float64)だと推論してくれる (環境による場合もあるけど、だいたいfloat64) fmt.Println(reflect.TypeOf(Answer)) // => int fmt.Println(reflect.TypeOf(Question)) // => string fmt.Println(reflect.TypeOf(Pi)) // => float64 (多くの場合) }
型を省略できるので、コードが少しスッキリしますね。ただ、すごく大きな数字を扱うときとか、特殊な型を使いたいときは、ちゃんと型を指定したほうが間違いがない場合もあります。
Go言語の定数`const`の具体的な使い方
理屈がわかったところで、次は実際に`const`がどんな場面で輝くのか、サンプルコードを見ながら体験してみましょう!
サンプルプログラム1:計算式での利用
まずは、計算式の中で`const`を使ってみます。例えば、商品の税込み価格を計算するプログラム。
package main import "fmt" func main() { const TaxRate float64 = 0.1 // 消費税率を定数で定義 (10%) var price1 int = 1000 var price2 int = 2500 // 税込み価格を計算 // intとfloat64は直接計算できないので、型変換が必要 totalPrice1 := float64(price1) * (1.0 + TaxRate) totalPrice2 := float64(price2) * (1.0 + TaxRate) fmt.Printf("商品1の税込み価格: %.0f 円\n", totalPrice1) // %.0fで小数点以下を表示しない fmt.Printf("商品2の税込み価格: %.0f 円\n", totalPrice2) }
実行結果
商品1の税込み価格: 1100 円 商品2の税込み価格: 2750 円
このコードのポイントは、`const TaxRate = 0.1` の部分です。もし税率が変わったとしても、この定数の値だけを変更すれば、計算式全体に反映されます。
コードのあちこちに `0.1` と書くよりも、ずっと修正が楽だし、間違いも起こりにくくなりますね。これが`const`を使う大きなメリットです!
サンプルプログラム2:設定値の管理
プログラムの中で使う「設定値」みたいなものを、`const`でまとめておくのもよくやる手です。
例えば、ゲームの設定値を考えてみましょう。
package main import "fmt" func main() { const ( MaxPlayers int = 4 // 最大プレイヤー数 DefaultLevel int = 1 // 初期レベル GameTitle string = "Go Quest" // ゲームタイトル ) fmt.Println("ようこそ", GameTitle, "へ!") fmt.Println("このゲームは最大", MaxPlayers, "人まで遊べます。") fmt.Println("初期レベルは", DefaultLevel, "です。") // 注意:APIキーのような秘密の情報は、 // 直接コードにconstで書くのは避けましょう。 // 設定ファイルや環境変数を使うのが一般的です。 }
実行結果
ようこそ Go Quest へ! このゲームは最大 4 人まで遊べます。 初期レベルは 1 です。
こうやってプログラムの最初に設定値を`const`でまとめておくと、どんな設定があるのか一目でわかりますし、後から設定を変えたくなったときも、この部分だけ見ればOKです。プログラム全体の見通しが良くなりますね。
ただし、APIキーやパスワードのような、他の人に知られたら困る秘密の情報を`const`で直接コードに書くのはやめましょうね!そういう情報は、設定ファイルとか、別の安全な方法で管理するのが普通です。
Go言語の定数`const`と変数`var`の違い
ここで、`const`(定数)と`var`(変数)の違いをしっかり整理しておきましょう。一番大きな違いは、もうお分かりかもしれませんが、値を後から変更できるかどうかです。
- `const` (定数): 一度値を決めたら、プログラムの実行中に絶対に変更できません。
- `var` (変数): 最初に値を入れた後でも、別の値を代入して変更できます。
イメージとしては、`const`は「石に刻まれた文字」、`var`は「書き換え可能なホワイトボード」みたいな感じです。
実際に`const`で宣言した定数の値を変更しようとすると、どうなるか見てみましょう。
package main import "fmt" func main() { const MyName = "Goたん" fmt.Println(MyName) // MyName = "Goにいさん" // ← これをやろうとするとエラー! // cannot assign to MyName (declared const) みたいなエラーが出ます }
このように、`const`で宣言した `MyName` に別の名前を代入しようとすると、プログラムを実行する前のチェック(コンパイル)の段階で「定数には代入できないよ!」と怒られてしまいます。
じゃあ、どんなときに`const`を使い、どんなときに`var`を使うのか?
- プログラムの実行中に絶対に変わらない値、または変えたくない値 → `const`を使う(例:円周率、税率、設定値)
- プログラムの実行中に値が変わる可能性があるもの → `var`を使う(例:計算結果、ユーザーからの入力、ループのカウンター)
この使い分けを意識するだけで、プログラムの意図が明確になり、バグが減らせますよ。
Go言語の定数`const`利用時の注意点
`const`は便利ですが、使うときにいくつか知っておきたい注意点があります。これを知っておくと、つまづきにくくなりますよ。
再代入はできない
これは`const`と`var`の違いでも触れましたが、本当に大事なことなのでもう一度。`const`で宣言したら、その定数に新しい値を代入することはできません。
うっかり代入しようとすると、プログラムを実行する前にエラーが出て教えてくれます。
package main func main() { const FixedValue = 100 // FixedValue = 200 // コンパイルエラー! 定数には再代入できない }
これは`const`の基本的なルールなので、しっかり覚えておきましょう。
コンパイル時に値が決定している必要がある
ここがちょっと初心者には難しいかもしれませんが、大事なポイントです。
`const`で宣言する値は、プログラムを実行する前(コンパイル時)に、その値が完全に決まっている必要があります。
どういうことかというと、例えば、関数の実行結果や、何かの計算をしないと値が決まらないようなものは、`const`にはできないのです。
package main import "math/rand" // 乱数を生成するパッケージ import "time" // 何か値を返す関数(例:現在時刻のナノ秒) func GetCurrentNano() int64 { return time.Now().UnixNano() } func main() { // これはOK。コンパイル時に値が決まっている const MaxSize = 1024 * 1024 // これはNG!関数の実行結果はコンパイル時には分からない // const RandomValue = rand.Intn(100) // コンパイルエラー! // const CurrentTime = GetCurrentNano() // これもコンパイルエラー! // こういう実行時に値が決まるものは変数(var)を使う var randomValue = rand.Intn(100) var currentTime = GetCurrentNano() fmt.Println(MaxSize, randomValue, currentTime) }
`const`はあくまで「プログラムを書いた時点で固定されている値」に使う、と覚えておいてくださいね。実行してみないと分からない値は`var`の出番です。
(補足)Goには`iota`という特殊な定数生成器があって、これを使うと連番の定数を簡単に作れたりします。`const`の仲間ですが、少し発展的な内容なので、まずは基本をしっかり押さえてから調べてみると面白いですよ!
(補足2)シャドーイングといって、例えば関数の中で、外で定義した定数と同じ名前の変数をうっかり作ってしまうと、関数の中ではその変数が優先されてしまうことがあります。意図しない挙動になることがあるので、名前の付け方には少し気を配ると良いでしょう。
【まとめ】Go言語の定数`const`を使いこなそう
今回はGo言語の定数`const`について、基本的なところから使い方、注意点まで見てきました。
最後にポイントをまとめておきましょう。
- `const`は値が変わらない定数を宣言するためのキーワード。
- 値を間違って書き換えるのを防ぎ、プログラムを読みやすくする。
- `const 定数名 = 値` や `const 定数名 型 = 値` のように書く。
- 複数の定数は `()` でまとめて宣言できる。
- 型は省略可能(型推論がきく)。
- 計算式や設定値の管理など、様々な場面で役立つ。
- 変数`var`との一番の違いは、再代入できるかどうか。
- `const`の値はコンパイル時に決まっている必要がある。
`const`を上手に使うことで、あなたのGoプログラムはもっと安全で、もっと分かりやすくなります。最初は`var`ばかり使ってしまうかもしれませんが、ぜひ「この値は変わらないな」と思ったら`const`を使ってみてください。
Go言語の学習、楽しんでいきましょう!
【関連記事】 Go言語とは?特徴・できること・将来性
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。