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コードを書くことができます。どんどんコードを書いて試してみてくださいね!