Like Share Discussion Bookmark Smile

J.J. Huang   2025-02-18   Getting Started Golang 02.資料結構   瀏覽次數:次   DMCA.com Protection Status

Go | 初步了解「映射」型別

💬 簡介

映射(Map)是一個非常強大且常用的資料結構,能夠讓我們根據鍵值(key)快速查找對應的值(value)。它類似於其他語言中的字典或哈希表,適用於需要快速查找或組織資料的情境。

本文將介紹映射型別的基本概念、宣告、初始化及常見操作,並展示如何靈活運用映射來解決實際問題。

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


✨ 映射的基本概念

映射(Map)是一種將「鍵」映射到「值」的資料結構。每一個映射都由鍵和值的對應關係組成,可以透過指定鍵來迅速取得對應的值。

1️⃣ 宣告與初始化映射

在 Go 中,映射可以使用 make 函式來初始化,並且指定其元素的型別。

  • 範例:宣告和初始化映射
    1
    2
    3
    4
    var scores map[string]int
    scores = make(map[string]int)
    scores["Alice"] = 90
    scores["Bob"] = 85

    📝 在這個範例中,我們創建了一個 map[string]int 類型的映射,用來存儲學生成績,並為 AliceBob 設定了分數。

2️⃣ 訪問映射元素

可以使用鍵來直接訪問映射中的值。如果鍵存在,會返回對應的值;如果鍵不存在,則返回映射型別的零值。

  • 範例:訪問映射元素
    1
    2
    3
    fmt.Println(scores["Alice"]) // 輸出: 90
    fmt.Println(scores["Bob"]) // 輸出: 85
    fmt.Println(scores["Carol"]) // 輸出: 0

    📝 在這個範例中,我們使用 scores["Alice"]scores["Bob"] 來訪問對應的分數,而 scores["Carol"] 不存在則返回映射型別的零值。


🛠️ 範例:基本映射操作

1️⃣ 定義並初始化映射

  • 範例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package main

    import "fmt"

    func main() {
    // 使用 make 函式初始化映射
    studentGrades := make(map[string]int)
    studentGrades["John"] = 80
    studentGrades["Jane"] = 95

    fmt.Println(studentGrades) // 輸出: map[John:80 Jane:95]
    }

    📝 在這個範例中,我們使用 make 函式創建並初始化了 studentGrades 映射,並加入了兩個學生成績。

2️⃣ 刪除映射中的元素

如果需要從映射中刪除某個鍵值對,可以使用 delete 函式。

  • 範例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package main

    import "fmt"

    func main() {
    scores := map[string]int{
    "Alice": 90,
    "Bob": 85,
    }

    // 刪除 "Bob" 的成績
    delete(scores, "Bob")
    fmt.Println(scores) // 輸出: map[Alice:90]
    }

    📝 在這個範例中,我們使用 delete 函式將 "Bob" 的成績從映射中刪除。

3️⃣ 判斷鍵是否存在

訪問映射時,可以使用 value, ok 的方式來檢查鍵是否存在。

  • 範例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package main

    import "fmt"

    func main() {
    scores := map[string]int{
    "Alice": 90,
    }

    value, ok := scores["Bob"]
    if ok {
    fmt.Println(value)
    } else {
    fmt.Println("Bob not found")
    }
    }

    📝 在這個範例中,我們檢查 "Bob" 是否存在於映射中,並根據檢查結果做出相應的處理。


💡 進階使用

↔️ 遍歷映射中的元素

可以使用 for 迴圈來遍歷映射中的所有鍵值對,利用 range 關鍵字來簡化操作。

  • 範例:遍歷映射
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package main

    import "fmt"

    func main() {
    studentScores := map[string]int{
    "Alice": 90,
    "Bob": 85,
    "Charlie": 88,
    }

    for name, score := range studentScores {
    fmt.Printf("%s: %d\n", name, score)
    }
    }

    📝 在這個範例中,我們使用 range 來遍歷 studentScores 映射,並輸出每個學生的姓名和分數。


🚀 映射的優化與限制

⚠️ 限制

  • 記憶體佔用:映射的記憶體使用是根據存儲的元素來動態分配的,當有大量元素時會佔用相對較大的記憶體。
  • 無序性:映射中的元素是無序的,因此無法保證遍歷時的順序。

🚀 優化

  • 選擇適當的鍵類型:映射的鍵應該是可以比較的類型,常見的有字串、數字等,避免使用無法比較的複雜類型。
  • 初始化映射容量:如果已知映射的元素數量,最好在初始化時預設容量來提高效能。

🎯總結

映射(Map)是一個非常強大的資料結構,能夠幫助我們根據鍵來高效地查找、更新和刪除對應的值。理解其基本操作和進階使用技巧將使你的程式更加靈活高效。

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


註:以上參考了
Go
Go-Map types