変数宣言
基本的には以下の形で変数の宣言が可能
var a int = 1 //-- ①
b := "Hello" //-- ②
Goにおける前提
Goではprivateとpublicのような接頭語がなく、大文字から始まるものをpublic、小文字で始まるものをprivateとしている。
この規則は変数だけでなく、関数、構造体のフィールドなどにも適用される。
var a int = 1 // private
var A int = 100 // public
privateの変数は他のパッケージから参照ができないので注意すること。
利用していない変数が存在するとエラーになる。
var Hoge string = "HOGE"
var Fuga string = "FUGA" // Fugaを宣言して利用していないのでエラーになる
fmt.Println(Hoge)
Goのメモリを無駄に消費しないという思想からきているらしい。(不要なimport文があるとエラーになるのも同じ理由っぽいです)
1. 基本的な宣言方法
Goでの変数宣言は以下のように
var [変数名] [型] = [値]
// var a int = 1
となり、Javaと順番が異なるので注意。
// 比較用 Java
private int a = 1
複数の同型の変数であれば、まとめて宣言することができる。
var a, b, c int = 1, 2, 3
宣言した変数と代入している数が異なるのでエラー
var a, b, c int = 1, 2, 3, 4 // Error 4
異なる型の変数を同時に宣言することはできない。
var a, b, c int = 1, 2, "Hoge" // Error Hoge
異なる方の変数を同時に宣言したい場合には、変数後に宣言した型を記述しない方法もある。この場合、異なる型の変数をまとめて宣言することができる。
var a, b, c = 1, true, "Hello" //--③
// go run main.go
1
true
Hello
2. 省略した宣言方法
Goでは基本的に以下のように省略した形の宣言方法ができる。
b := "Hello" //-- ②
この宣言の場合、Goが自動的に型を予測してくれる。
:=
を使った変数の短縮宣言は、関数内部でのみ有効。関数外では使えないため、グローバル変数を宣言する場合はvar
を使用する必要があります。
package main
// func外では var のみ
var var1 = "global"
func main() {
var2 := "local"
fmt.Println(var1, var2)
}
3. 複数の変数をブロックで宣言できる
複数の変数をまとめて宣言する方法として、ブロックスタイルの宣言も可能。複数の変数をまとめてわかりやすく宣言できるが個人的にあまり見たことはない。
var (
a int = 1
b string = "Hello"
c bool = true
)
4. 未初期化変数のデフォルト値
初期化していない場合、Goでは以下のように変数が初期化される。
var i int // 0
var s string // ""
var b bool // false
5. 変数のシャドウイング
Goでは、同じ名前の変数をブロック内で再定義することができ、これを「シャドウイング」と呼ぶ。外側のスコープで定義された変数を、内側のスコープで上書きする形になる。
package main
import "fmt"
var x = "global"
func main() {
fmt.Println(x) // "global"
x := "local"
fmt.Println(x) // "local"
}