短縮形宣言演算子についてコードブロック内でどのように使うか見てきました。では、より広いスコープでアクセスしたい変数がある場合はどうすればよいのでしょう?
package main
import (
"fmt"
)
func main() {
x := 42 + 7 /* xのスコープはここから以下 */
y := "James Bond" /* yのスコープはここから以下 */
fmt.Println(x)
fmt.Println(y)
x = 50
fmt.Println(x)
}
変数の宣言前にアクセスすることはできません。スコープの外だからです。(以下のコードはコンパイルできません。)
package main
import (
"fmt"
)
func main() {
x := 42 + 7
y := "James Bond"
fmt.Println(x)
fmt.Println(y)
x = 50
fmt.Println(x)
}
func foo() {
fmt.Println(x) /* xはスコープから外れている */
}
tmp/sandbox324213631/main.go:17: undefined: x
といったエラーが出るでしょう。17行目でx
にアクセスしようとしていますが、できないからです。
ときにはコードブロックのスコープよりも広い範囲の変数スコープが欲しいこともあるでしょう。var
を使えばパッケージレベルのスコープを得られます。Goドキュメントのkeywordsを見てキーワードを確認してみましょう。
var
キーワードは変数の作成のために使います。変数z
を追加し、21を割り当てます。
package main
import (
"fmt"
)
var z = 21
func main() {
x := 42 + 7
y := "James Bond"
fmt.Println(x)
fmt.Println(y)
x = 50
fmt.Println(x)
fmt.Println(z) /* zはここでもスコープ内 */
}
func foo() {
fmt.Println(z) /* zはパッケージ内ならどこでもスコープ内 */
}
良いコードのために: 変数宣言と値の割り当てのために、コードブロック内では常に短縮形宣言演算子を使うようにしましょう。もしパッケージレベルでのスコープが必要なときだけvar
を使うと良いでしょう。
まとめ: パッケージレベルで変数を作成したい場合はvar
を使います。このように使います。var greeting = "Hello there"