【初心者向け】Go言語の定数constを完全マスター!varとの違いもわかる

2025年4月16日水曜日

Go言語

この記事では、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言語とは?特徴・できること・将来性

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ