1. 程式人生 > >go 短宣告與作用域

go 短宣告與作用域

1、if,for,switch 的短宣告和控制語句塊({}包含部分),是巢狀的內外作用域(else if 是緊跟的 if 的內部作用域,並非相同的作用域);獨立於外部作用域。

func main() {
	x := 6    //1
	if x:= 3; x > 4{ //2

		fmt.Println("x is greater than", x)
	}else if x:= 5; x < 6{ //3
	
		fmt.Println("x is smaller than", x)
	}
	
	fmt.Println(x)
}

1,2,3 處的三個 x 處於三個巢狀的作用域,是三個不同的 x:1在2的外層,2在3的外層。所以輸出是

x is smaller than 5
6

func main() {
	x := 4    //1
	if x:= 3; x > 4{ //2

		fmt.Println("x is greater than", x)
	}else if x:= 5; x < 6{ //3
		x := 7
		fmt.Println("x is smaller than", x)
	}
	
	fmt.Println(x)
}

if 的短宣告和 if 的控制塊,是內外作用域。內部遮蔽外部,所以輸出是

x is smaller than 7
6

2、函式的引數和返回值與函式體,是相同的作用域;獨立於外部作用域。

func f(s int) (r int){
		s := 3  //由於引數和返回值和函式體在相同作用域,所以這裡段宣告重複定義了,構建報錯
		r := 3  //同上
		fmt.Println(s)
		return
	}

3、短宣告總是會在當前作用域建立新的變數;如果當前作用域已經有同名變數,將構建錯誤。