下記のようなコードを入力してみる。
package main import "fmt" func main() { var str string var i int // if文を使うためのダミーの変数 if i == 0 { var str string str = "hello" fmt.Println(str) } fmt.Println(str) }
実行すると、helloと表示される。
ここで、注目したいのは、func mainの中でstrを2回使いfmt.Printlnを2回使用しているが、ifの中でのstrだけが認識されて、ブロック※内でのみhelloが表示され、ブロック外では空文字が表示された。これをブロックのスコープと呼ぶ。
※ブロックは{}で囲まれた個所のこと
変数を用意する時、変数には影響範囲があってどこに変数を記載するかによって、変数の優先順位が決まる。
変数の優先順位の高い順にブロック内、関数内、ファイル内、パッケージ内になっていて、今回の例では関数内に変数を作って、さらにブロック内で同名の変数を作って上書きした例になる。関数内で値を入れずにブロック内に値を入れて、実行してみたところ、同名の変数にも関わらず、関数のスコープの中には、値が入っていないことになり、ifの中だけが実行され、helloが1回表示された。
main関数内でブロックの外に書いた変数str(main関数内の一行目)は関数のスコープとして扱う。