Go | 初步了解變數作用範圍
💬 簡介
在 Go 語言中,變數的作用範圍(Scope)指的是一個變數可以被訪問和使用的區域。了解變數的作用範圍對於寫出更清晰、更高效的程式碼至關重要。
本篇文章將介紹 Go 中的變數作用範圍,並通過範例幫助了解不同作用範圍下的變數使用方法。
圖片來源:Gophers(地鼠造型的原創者為 Renee French)
🔎 變數作用範圍的基礎概念
1️⃣ 全域變數(Global Variables)
全域變數是在函式外部宣告的變數,可以在整個程式中使用。全域變數的作用範圍是從宣告位置開始,直到程式結束。
- 範例:全域變數使用
1
2
3
4
5
6
7
8
9package main
import "fmt"
var globalVar = "這是全域變數"
func main() {
fmt.Println(globalVar) // 可以在 main 函式中使用全域變數
}📝在此範例中,
globalVar
是一個全域變數,可以在程式的任何位置被訪問和使用。
2️⃣ 區域變數(Local Variables)
區域變數是在函式內部宣告的變數,其作用範圍僅限於該函式。當函式執行完畢後,區域變數的生命週期結束,變數會被銷毀。
- 範例:區域變數使用
1
2
3
4
5
6
7
8package main
import "fmt"
func main() {
var localVar = "這是區域變數"
fmt.Println(localVar) // 只能在此函式內部使用
}📝在此範例中,
localVar
是一個區域變數,只能在main
函式內部訪問,若在函式外部使用會導致錯誤。
3️⃣ 形式參數(Formal Parameters)
形式參數是函式宣告時所指定的參數,它們的作用範圍限於該函式的執行過程。與實際傳入的參數不同,形式參數只是在函式內部使用。
- 範例:形式參數使用
1
2
3
4
5
6
7
8
9
10
11package main
import "fmt"
func greet(name string) {
fmt.Println("Hello,", name) // name 是形式參數
}
func main() {
greet("Alice") // 傳入實際參數 "Alice"
}📝在此範例中,
name
是函式greet
的形式參數,當greet
被呼叫時,實際的參數 “Alice” 被傳遞到name
中。
4️⃣ 函式內部與外部變數的遮蔽
如果在內部範圍宣告了一個變數,該變數會遮蔽外部範圍的同名變數。這是一個常見行為,開發者應該注意這點,避免意外的變數遮蔽。
- 範例:遮蔽外部變數
1
2
3
4
5
6
7
8
9
10package main
import "fmt"
var message = "外部變數"
func main() {
var message = "內部變數" // 這會遮蔽外部的 message 變數
fmt.Println(message) // 輸出:內部變數
}📝在此範例中,內部的
message
變數遮蔽了外部的同名變數,因此輸出的結果是「內部變數」。
5️⃣ 變數作用範圍與區塊
變數的作用範圍是由其所在的區塊決定的。無論是函式、迴圈還是條件語句,每個區塊內的變數都具有自己的作用範圍。
- 範例:區塊範圍的變數
1
2
3
4
5
6
7
8
9
10
11package main
import "fmt"
func main() {
if true {
var blockVar = "這是區塊範圍的變數"
fmt.Println(blockVar) // 可以在 if 區塊內使用
}
// fmt.Println(blockVar) // 編譯錯誤,區塊外部無法訪問 blockVar
}📝在這個範例中,
blockVar
只在if
區塊內有效,區塊外無法訪問,這是作用範圍的特性。
⚠️ 注意事項
1️⃣ 避免全域變數濫用
雖然全域變數可以在整個程式中使用,但過多的全域變數會使程式變得難以維護。過度依賴全域變數會導致程式出現意外錯誤,並且增加了測試與維護的難度。
- 範例:避免濫用全域變數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import "fmt"
var globalVar = "全域變數"
func modifyGlobalVar() {
globalVar = "修改後的全域變數" // 函式內修改全域變數
}
func main() {
fmt.Println(globalVar) // 輸出:全域變數
modifyGlobalVar()
fmt.Println(globalVar) // 輸出:修改後的全域變數
}📝這個範例展示了全域變數的修改,雖然可行,但過度使用全域變數可能會讓程式更難理解與維護。
2️⃣ 使用區域變數提高程式可讀性
區域變數有助於減少全域狀態的依賴,使程式邏輯更加清晰。盡量將變數的作用範圍限制在必要的最小範圍內,以提升程式的可讀性與可維護性。
🎯總結
變數作用範圍是程式設計中非常重要的概念。了解全域變數、區域變數、形式參數以及它們如何在不同範圍內運作,將有助於寫出更高效、清晰的程式。在開發過程中,合理規劃變數的作用範圍,能讓程式碼更易於理解與維護。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go
Effective Go