# 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`