Go言語の変数宣言、特に短縮記法 `:=` について、学んでいきましょう!
Go言語のコードを眺めていると、`var` 以外に `:=` という記号で変数が登場することがありますよね。あれが今回の主役、短縮変数宣言です。
この記事では、`:=` の基本的な意味や使い方、お馴染みの `var` との違い、そして「おっと、これは使っちゃダメだった!」となりがちな注意点まで、サンプルコードをたっぷり交えて解説を進めます。
コードを書くのがちょっと面倒…なんて思ってる人も、`:=` をマスターすればキーボードを叩く回数がグッと減るかもしれませんよ!
この記事でわかること
- `:=` って何? その正体がわかる
- `var` と `:=` の違いがスッキリ理解できる
- `:=` の正しい使い方をマスターできる
- うっかりミスを防ぐ注意点がわかる
さあ、Goプログラミングがもっと楽しくなる、ちょっとしたコツを一緒に見ていきましょう!
Go言語の短縮変数宣言「:=」とは?
Go言語には、変数を宣言して、同時に初期値を設定するための便利な書き方があります。それが、短縮変数宣言演算子と呼ばれる `:=` です。
通常、変数を宣言するときは `var` というキーワードを使いますが、`:=` を使うと、この `var` キーワードと、多くの場合データ型の指定を省略できるんです。つまり、より短い記述で変数の準備が整うというわけですね。
例えば、メッセージを格納する変数を準備したい場合、
var message string = "こんにちは!"
と書く代わりに、`:=` を使えば
message := "こんにちは!"
これだけでOK。だいぶスッキリしましたよね? Go言語はプログラムを簡潔に、読みやすく書けるように工夫されている言語で、この `:=` もその工夫の一つと考えてください。
Go言語での変数の宣言方法(`var` と `:=` (短縮) を比較)
Go言語で変数を扱う上で基本となる `var` と、便利な省略形 `:=`。この二つはどう違うのか、ここでしっかり整理しておきましょう。どちらを使うべきか迷う場面も減るはずです。
`var` を使った基本的な変数宣言
まずは基本の `var` からおさらいです。`var` は、変数を宣言するためのキーワード。こんな風に使います。
// 型だけを指定して宣言(初期値はゼロ値になる) var score int var name string // 型を指定して初期値を設定 var age int = 30 // 型を省略して初期値を設定(Goが型を推測してくれる) var message = "明日は晴れるかな?" // 関数の外(パッケージレベル)でも宣言できる var GlobalMessage = "どこからでもアクセス可能"
`var` はGoの基本中の基本となる変数宣言の方法で、関数の「中」でも「外」でも使うことができます。初期値を設定しない場合は、数値なら 0、文字列なら空文字列 "" のような、その型の「ゼロ値」と呼ばれる値が自動で入ります。
`:=` (短縮) を使った変数宣言
次に、短縮変数宣言 `:=` です。これは、`var` とデータ型の記述を省略できる便利な書き方でしたね。
// 変数名 := 初期値 message := ":= を使ってみよう!" count := 100 isOk := true // bool型 (trueかfalse)
このように、`var` キーワードも、`string` や `int` といった型名も書かなくて良いのが大きな特徴です。Goコンパイラが、右辺の初期値を見て「ふむふむ、これは文字列だな」「これは整数だな」と判断してくれるんです。
ただし、`:=` を使うと、型を書かなくてもGoが賢く判断してくれる ので楽ちんですが、使える場所に関数の中という制限がある点は覚えておきましょう。(詳しくは後述します)
`var` と `:=` (短縮) の主な違いまとめ
ここで、`var` と `:=` の主な違いをまとめておきます。
- キーワードと型宣言
- `var`: `var` キーワードが必要。型宣言は省略できる場合もある。
- `:=`: `var` キーワードも型宣言も不要(Goが推測する)。
- 宣言と初期化
- `var`: 宣言だけも可能(初期値はゼロ値になる)。宣言と初期化を同時に行うこともできる。
- `:=`: 宣言と初期化を必ず同時に行う必要がある。
- 使える場所
- `var`: 関数の内側でも外側(パッケージレベル)でも使える。
- `:=`: 関数の内側(ブロックレベルスコープ)でしか使えない。
ざっくり言うと、関数の中でサッと変数を宣言して初期値を設定したい、そんな場面では `:=` が便利。関数の外で変数を使いたい場合や、初期値を後から設定したい場合などは `var` を使う、という使い分けになります。`:=` は関数の中だけで使える便利な省略形と覚えておくと良いでしょう。
Go言語の短縮変数宣言「:=」の使い方
理屈がわかったところで、実際に `:=` を使ってみましょう。サンプルコードを見ながら、具体的な使い方に慣れていきましょう。
基本的な書き方とサンプルコード
まずは一番シンプルな使い方から。変数名を書いて、`:=` を書き、初期値を設定します。
package main import "fmt" func main() { // 文字列型の変数を宣言・初期化 greeting := "やあ、世界!" fmt.Println(greeting) // 出力: やあ、世界! // 整数型の変数を宣言・初期化 number := 42 fmt.Println(number) // 出力: 42 // 浮動小数点数型の変数を宣言・初期化 pi := 3.14159 fmt.Println(pi) // 出力: 3.14159 // 論理型の変数を宣言・初期化 isActive := true fmt.Println(isActive) // 出力: true }
このコードを実行すると、それぞれの `Println` でカッコ内の値が出力されるはずです。Goが右辺の値を見て、`greeting` は `string` 型、`number` は `int` 型、`pi` は `float64` 型、`isActive` は `bool` 型だと自動で判断してくれています。
サンプルコードを自分の環境で動かして、型がどうなるか確認するのが一番の近道です。ぜひ試してみてください。
複数の変数を同時に宣言・初期化する
`:=` は、複数の変数を一度にまとめて宣言・初期化することも可能です。これはかなり便利!
package main import "fmt" func main() { // 複数の変数を同時に宣言・初期化 width, height := 100, 50 fmt.Println("幅:", width, "高さ:", height) // 出力: 幅: 100 高さ: 50 // 関数の戻り値を受け取る例( giả định hàm swap があるとする) // a, b := swap("こんにちは", "さようなら") // swap関数が2つの値を返すと仮定 // fmt.Println(a, b) } /* // 参考: 2つの文字列を入れ替えて返す架空の関数 func swap(x, y string) (string, string) { return y, x } */
このように、左辺にカンマ区切りで変数名を、右辺にカンマ区切りで初期値を書けばOK。変数の数と値の数が合っている必要があります。
特に関数が複数の値を返す場合(Goではよくあります)、それらをまとめて受け取るのに `:=` は大活躍します。
`var` で書くと少し冗長になるところを、`:=` ならスッキリ書けるのです。複数の値を一度に扱えるのが `:=` のパワフルな点と言えるでしょう。
Go言語の短縮変数宣言「:=`」を使う上での注意点
便利な `:=` ですが、いくつか気をつけるべきルールがあります。これを守らないとコンパイルエラーになってしまうので、しっかり確認しておきましょう!
【注意点1】新しい変数の宣言にのみ使用可能
`:=` は、その行で少なくとも1つは新しい変数を宣言する場合にしか使えません。言い換えると、すでに宣言されている変数だけに値を再代入する目的では使えない、ということです。既存の変数に値を入れ直すときは、`=` (イコール)を使います。
package main import "fmt" func main() { // OK: `x` はここで新しく宣言される x := 10 fmt.Println(x) // 出力: 10 // OK: `y` は新しい変数なので `:=` が使える(`x` は既存だが問題ない) x, y := 20, 30 fmt.Println(x, y) // 出力: 20 30 // NG: `x` も `y` も既に宣言済みなので `:=` は使えない // x, y := 40, 50 // これはコンパイルエラーになる! (no new variables on left side of :=) // 正しい再代入: 既存の変数には `=` を使う x = 40 y = 50 fmt.Println(x, y) // 出力: 40 50 }
エラーメッセージで `no new variables on left side of :=` と出たら、「あ、`:=` の左側に新しい変数がいないんだな」と思い出してください。`:=` はあくまで新しい変数を「宣言」するためのもの、`=` は既に存在する変数に値を「代入」するもの、としっかり区別しましょう。
【注意点2】関数スコープ(ブロックレベルスコープ)内でのみ使用可能
もう一つの重要なルールは、`:=` は関数の中(または `if` 文や `for` 文などのブロックの中)でしか使えないということです。関数の外側、つまりパッケージレベルでグローバル変数などを宣言したい場合は、`var` キーワードを使う必要があります。
package main import "fmt" // NG: 関数の外では `:=` は使えない // globalVar := "これはエラーになる" // OK: 関数の外では `var` を使う var globalVar = "これはOK" func main() { // OK: 関数の中なので `:=` が使える localVar := "関数の中ならOK" fmt.Println(globalVar) // 出力: これはOK fmt.Println(localVar) // 出力: 関数の中ならOK }
もし関数の外で `:=` を使おうとすると、`non-declaration statement outside function body` のようなコンパイルエラーが出ます。「関数の外で宣言以外の文があるよ」と言われているわけですね。
プログラム全体で使う定数のようなものや、複数の関数から参照される変数を準備したいときは、関数の外で宣言することになります。そういった場合は、関数の外で変数を使いたいなら `var` を選ぶ、と覚えておきましょう。
【まとめ】Go言語の短縮変数宣言「:=」を理解して使いこなそう!
今回は、Go言語の短縮変数宣言 `:=` について、基本的な使い方から `var` との違い、そして注意点までを見てきました。
ポイントをもう一度おさらいしましょう。
- `:=` は `var` と型宣言を省略して、変数の宣言と初期化を同時に行う便利な書き方。
- 関数の中だけで使用可能。
- 使うときは、左辺に少なくとも1つは新しい変数が必要。
- 既存の変数への再代入は `=` を使う。
`:=` を上手に使うことで、Goのコードはより簡潔に、そして読みやすくなります。最初は `var` との使い分けに少し戸惑うかもしれませんが、慣れてくれば自然と手が動くようになるはずです。
特に、関数内で一時的に使う変数を宣言する場合などには、積極的に `:=` を活用してみてください。
注意点さえ守れば、あなたのGoプログラミングをきっと助けてくれるはずです。恐れずに、どんどん使って、Goらしいコードを書いていきましょう!
【関連記事】 Go言語とは?特徴・できること・将来性
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。