Like Share Discussion Bookmark Smile

J.J. Huang   2025-01-17   Getting Started Golang 01.基本型別   瀏覽次數:次   DMCA.com Protection Status

Go | 初步了解變數作用範圍

💬 簡介

在 Go 語言中,變數的作用範圍(Scope)指的是一個變數可以被訪問和使用的區域。了解變數的作用範圍對於寫出更清晰、更高效的程式碼至關重要。

本篇文章將介紹 Go 中的變數作用範圍,並通過範例幫助了解不同作用範圍下的變數使用方法。

圖片來源:Gophers(地鼠造型的原創者為 Renee French)


🔎 變數作用範圍的基礎概念

1️⃣ 全域變數(Global Variables)

全域變數是在函式外部宣告的變數,可以在整個程式中使用。全域變數的作用範圍是從宣告位置開始,直到程式結束。

  • 範例:全域變數使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package main

    import "fmt"

    var globalVar = "這是全域變數"

    func main() {
    fmt.Println(globalVar) // 可以在 main 函式中使用全域變數
    }

    📝在此範例中,globalVar 是一個全域變數,可以在程式的任何位置被訪問和使用。

2️⃣ 區域變數(Local Variables)

區域變數是在函式內部宣告的變數,其作用範圍僅限於該函式。當函式執行完畢後,區域變數的生命週期結束,變數會被銷毀。

  • 範例:區域變數使用
    1
    2
    3
    4
    5
    6
    7
    8
    package 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
    11
    package 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
    10
    package 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
    11
    package 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
    15
    package main

    import "fmt"

    var globalVar = "全域變數"

    func modifyGlobalVar() {
    globalVar = "修改後的全域變數" // 函式內修改全域變數
    }

    func main() {
    fmt.Println(globalVar) // 輸出:全域變數
    modifyGlobalVar()
    fmt.Println(globalVar) // 輸出:修改後的全域變數
    }

    📝這個範例展示了全域變數的修改,雖然可行,但過度使用全域變數可能會讓程式更難理解與維護。

2️⃣ 使用區域變數提高程式可讀性

區域變數有助於減少全域狀態的依賴,使程式邏輯更加清晰。盡量將變數的作用範圍限制在必要的最小範圍內,以提升程式的可讀性與可維護性。


🎯總結

變數作用範圍是程式設計中非常重要的概念。了解全域變數、區域變數、形式參數以及它們如何在不同範圍內運作,將有助於寫出更高效、清晰的程式。在開發過程中,合理規劃變數的作用範圍,能讓程式碼更易於理解與維護。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go
Effective Go