下記のようなコードを入力してみる。

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関数内の一行目)は関数のスコープとして扱う。