iT邦幫忙

2024 iThome 鐵人賽

DAY 11
1
Modern Web

Go 快 Go 高效: 從基礎語法到現代Web應用開發系列 第 11

【Day11】Golang 核心語法 | 映射(Map)與鍵值對操作

  • 分享至 

  • xImage
  •  

在 Golang 中,映射(Map)是一種基於鍵值對(key-value pair)的數據結構,類似於其他語言中的字典(Dictionary)或哈希表(Hash Table)。

map介紹

  • map的基本結構:
map[鍵類型]值類型
  • 鍵類型(Key Type): 必須是可以比較的類型,例如 intstringbool 等。
  • 值類型(Value Type): 可以是任何類型,你想得到的都能實現。
  • 建立一個基本的 Map
// 初始化一個空的 map
personAge := make(map[string]int)  // 鍵是 string,值是 int

// 在宣告時同時給予初始的鍵值對
personAge := map[string]int{
    "Alice": 25,
    "Bob":   30,
}

在使用 map 前,我們需要初始化它。通常透過 make() 函數來建立一個映射。你也可以直接使用字面量來初始化一個映射。
Note:使用 make() 的詳細資訊,請參考 第8天的教學文

  • CRUD(新增/讀取/更新/刪除)
// 宣告並初始化一個映射
personAge := make(map[string]int)

// 新增鍵值對
personAge["Alice"] = 25
personAge["Bob"] = 30

// 獲取值
fmt.Println(personAge["Alice"])

// 更新值
personAge["Alice"] = 26

// 刪除值
delete(personAge, "Alice")
  • 確保鍵唯一性
personAge["Alice"] = 28 // 覆蓋 Alice 的舊值 26

在映射中,鍵是唯一的,重複的鍵會覆蓋之前的值。因此,你無需擔心插入相同的鍵會造成錯誤,因為這種情況下,映射只會更新該鍵對應的值。

  • 使用 Empty Struct 檢查值的存在性
m := make(map[int]struct{})
m[1] = struct{}{}

// Check exists
_, ok := m[1]

fmt.Println(ok)
</* Output: */>
true

在 Golang 中,struct{} 是一個空結構體(Empty Struct),不佔用任何額外的內存(大小為 0),通常可用來作為佔位符,表示邏輯上的“空”對象。例如,你只在意某個鍵是否存在,而不在意具體存儲什麼值時,可以用 struct{} 來表示某些資源已被初始化過,因為空結構體不會佔用額外的記憶體。

  • 儲存不同類型的數據
package main

import "fmt"

func main() {
    // 初始化一個 map,鍵是 string,值是 interface{}
    data := map[string]interface{}{
        "name":    "Alice",
        "age":     25,
        "isAdult": true,
    }

    // 訪問不同類型的值
    fmt.Println("Name:", data["name"])
    fmt.Println("Age:", data["age"])
    fmt.Println("Is Adult:", data["isAdult"])

    // 新增一個浮點數
    data["height"] = 5.6
    fmt.Println("Height:", data["height"])
}
</* Output: */>
Name: Alice
Age: 25
Is Adult: true
Height: 5.6

在這個範例中,我們將字串、整數、布林值和浮點數都存儲在同一個 map 裡,因為 interface{} 允許任何類型的值。


總結

今天我們學到了 Golang 中 map 的基本結構與操作,包括如何初始化、執行 CRUD 操作、確保鍵的唯一性、以及使用 Empty Struct 來節省內存並檢查鍵的存在性。此外,還展示了如何使用 interface{} 在同一個 map 中存儲多種不同類型的數據。


延伸思考

  • map[string]interface{}{} 又是做什麼用途?

上一篇
【Day10】封裝與多態性 II | 鬆散耦合
下一篇
【Day12】Golang 核心語法 | 指標與記憶體管理(Pointers & Memory Management)
系列文
Go 快 Go 高效: 從基礎語法到現代Web應用開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言