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