[Goのはじめ方] Part5: 変数と定数(:=, var, const)

Go

Go言語でのプログラミングの第一歩として、データの入れ物となる「変数」と、変わらない値である「定数」について学びましょう。Goにはいくつかの宣言方法があり、状況に応じて使い分けることが大切です。😊

変数宣言 📦

変数は、プログラムの中でデータを一時的に保存しておくための名前付きの箱のようなものです。Go言語では主に2つの方法で変数を宣言します。

var キーワードを使った宣言

最も基本的な変数宣言の方法です。var キーワードの後ろに変数名、そしてデータ型を記述します。

package main

import "fmt"

func main() {
    // 型を指定して変数を宣言 (初期値はゼロ値)
    var age int
    fmt.Println("年齢:", age) // 出力: 年齢: 0

    // 値を代入
    age = 30
    fmt.Println("年齢:", age) // 出力: 年齢: 30

    // 宣言と同時に初期化 (型指定あり)
    var name string = "Gopher"
    fmt.Println("名前:", name) // 出力: 名前: Gopher

    // 初期化時に型を省略 (型推論)
    var message = "Hello, Go!"
    fmt.Println(message) // 出力: Hello, Go! (型はstringと推論される)
}

💡 ゼロ値とは?

var で変数を宣言し、初期値を指定しない場合、Goは自動的に「ゼロ値」という初期値を設定します。データ型ごとにゼロ値は決まっています。

  • 数値型 (int, float など): 0
  • bool型: false
  • string型: "" (空文字列)
  • ポインタ、関数、インターフェース、スライス、チャネル、マップ: nil

var は、関数の外(パッケージレベル)で変数を宣言する場合や、初期値を指定せずに後で値を代入する場合、ゼロ値を利用したい場合などに使われます。

:= (短縮変数宣言) を使った宣言

関数の中では、より短く書ける := 演算子を使った宣言がよく使われます。これは var と型宣言を省略した形です。関数内でのみ使用可能です。

package main

import "fmt"

func main() {
    // 短縮変数宣言 (型は右辺の値から自動で推論される)
    count := 10         // int型と推論
    pi := 3.14          // float64型と推論
    isActive := true    // bool型と推論
    greeting := "Hi!"   // string型と推論

    fmt.Println(count, pi, isActive, greeting) // 出力: 10 3.14 true Hi!

    // 再代入は = を使う
    count = 20
    fmt.Println(count) // 出力: 20

    // := は宣言と初期化を同時に行うため、既に宣言済みの変数には使えない
    // count := 30 // コンパイルエラー: no new variables on left side of :=

    // ただし、左辺に一つでも新しい変数があれば使える
    count, newVar := 50, "new" // countは再代入、newVarは新規宣言
    fmt.Println(count, newVar) // 出力: 50 new
}

⚠️ := の注意点

  • 関数内でのみ利用可能です。パッケージレベルの変数宣言には var を使う必要があります。
  • 宣言と初期化を同時に行う必要があります。
  • 左辺の変数の少なくとも一つは新しい変数である必要があります。
  • 型は右辺の値から自動的に推論されます。明示的に型を指定したい場合は var を使用します。

var と := の使い分け

どちらを使うべきか迷うかもしれませんが、一般的には以下のガイドラインが推奨されます。

  • 関数内では、可能な限り := (短縮変数宣言) を使うのが Goらしい書き方とされています。コードが簡潔になります。
  • 変数の初期値を明示しない場合や、ゼロ値を利用したい場合は var を使います。
  • 関数の外(パッケージレベル)で変数を宣言する場合は var を使います(:= は使えません)。
  • 特定の型を明示的に指定したい場合(例えば、int ではなく int64 を使いたい場合など)は var を使います。

基本的には関数内では := を使い、必要に応じて var を使う、というスタンスで良いでしょう。

複数の変数をまとめて宣言

var キーワードを使って、複数の変数を一度に宣言することもできます。

package main

import "fmt"

var (
    appVersion string = "1.0.0" // パッケージレベル変数
    debugMode  bool   = false
)

func main() {
    // 同じ型の変数をまとめて宣言・初期化
    var x, y int = 10, 20
    fmt.Println(x, y) // 出力: 10 20

    // 型推論を使って異なる型の変数をまとめて宣言・初期化
    var host, port = "localhost", 8080
    fmt.Println(host, port) // 出力: localhost 8080

    // 短縮変数宣言でも複数代入が可能
    a, b := "Go", true
    fmt.Println(a, b) // 出力: Go true

    fmt.Println(appVersion, debugMode) // 出力: 1.0.0 false
}

定数宣言 💎

定数は、プログラムの実行中に値が変わらない、固定された値です。円周率やアプリケーションのバージョン名など、変更されるべきでない値に使います。定数は const キーワードを使って宣言します。

package main

import "fmt"

const Pi float64 = 3.14159 // 型を明示
const Version = "1.0.1"    // 型を省略 (stringと推論)

// グループ化して宣言
const (
    StatusOK    = 200
    StatusNotFound = 404
)

// iotaを使った連番定数
const (
    Sunday = iota // 0から始まる連番を自動生成
    Monday        // 1 (前の行の式が繰り返される)
    Tuesday       // 2
    Wednesday     // 3
    Thursday      // 4
    Friday        // 5
    Saturday      // 6
)

func main() {
    fmt.Println(Pi, Version)    // 出力: 3.14159 1.0.1
    fmt.Println(StatusOK, StatusNotFound) // 出力: 200 404
    fmt.Println(Sunday, Monday, Tuesday) // 出力: 0 1 2

    // 定数は再代入できない
    // Pi = 3.14 // コンパイルエラー: cannot assign to Pi
}

🚀 iota とは?

iota は Go言語に組み込まれた特別な定数生成器です。const 宣言ブロック内で使われ、各定数宣言ごとに 0 から始まり 1 ずつ増加する整数値を生成します。

  • const ブロックが現れるたびに 0 にリセットされます。
  • 定数宣言が省略された場合、前の行の式(iota を含む)が繰り返されます。
  • 列挙型(enum)のような連番の定数を定義する際に非常に便利です。
  • 式の中で使うこともできます (例: const ( FlagA = 1 << iota // 1 ) )。

定数はコンパイル時に値が決定され、プログラム実行中に変更することはできません。これにより、コードの安全性が高まります。

まとめ 📝

Go言語における変数と定数の宣言方法をまとめます。

キーワード 形式 場所 初期値 型指定 主な用途
var var name type = value
var name = value
var name type
関数内外 指定可 / ゼロ値 必須 / 省略可(推論) パッケージレベル変数、ゼロ値を使いたい場合、型を明示したい場合
:= name := value 関数内のみ 必須 不可(常に推論) 関数内でのローカル変数宣言(推奨)
const const Name type = value
const Name = value
関数内外 必須 省略可(推論) 変更されない固定値、設定値、iotaを使った連番

これらの宣言方法を理解し、状況に応じて適切に使い分けることで、読みやすく、効率的なGoコードを書くことができます。どんどんコードを書いて試してみてくださいね!🚀

コメント

タイトルとURLをコピーしました