---
# System prepended metadata

title: 'Day 5 : Golang scope'
tags: [About Go]

---

# Day 5 : Golang scope
在Golang中每個變數都有其作用範圍，最上層的就是一開始宣告的package範圍，然後每個變數範圍下面又包含其他子範圍，而每個子範圍的開始與結束會用<span style="color:red">`{}` </span>(curly bracket)來界定。

當我們執行某段Go程式要存取某個變數的時候，Go會開始檢查其scope，如果該範圍沒有就會往上層範圍尋找，直到找到最上面的package範圍為止。以下面程式碼if條件是所定義的scope為例，因為在自己的範圍找不到bootcamp變數，所以會往上一層的main scope找，但main定義的範圍也沒有bootcamp變數，所以繼續往上一層找，直到找到package scope，才發現bootcamp有被賦值為wehelp。


```go!
package main

import "fmt"

var bootcamp string="wehelp"  //package scope

func main() {
	fmt.Println(bootcamp)  // main scope 得到 wehelp
	if true{
		fmt.Println(bootcamp) // main下面的if scope得到 wehep
		best()
	}
}

func best(){
	fmt.Println(bootcamp)   // best 函式的scope 得到 wehelp
}
```
這邊值得注意的是，best()函式是在package scope定義的，所以best()內部要存取bootcamp變數會到package所定義的全域去尋找變數。以下面例子為例，第一個印出的"bootcamp"一樣是wehelp，但因為在main這個子範圍有再定義一次bootcamp，所以第二個會印出"coding"。至於在if中定義的best()函數，則是會往其上一層package尋找，所以會得到最一開始定義的"bootcamp"
```go!
package main

import "fmt"

var bootcamp string="wehelp" 

func main() {
	fmt.Println(bootcamp)  // bootcamp

	bootcamp := "coding"
	if true{
		fmt.Println(bootcamp) // coding
		best()
	}
}

func best(){
	fmt.Println(bootcamp)   // bootcamp

}
```


## References
1. https://ithelp.ithome.com.tw/articles/10269869

###### tags: `About Go`