在 Golang 中,映射(Map)是一種基於鍵值對(key-value pair)的數據結構,類似於其他語言中的字典(Dictionary)或哈希表(Hash Table)。
map[鍵類型]值類型
- 鍵類型(Key Type): 必須是可以比較的類型,例如
int
、string
、bool
等。- 值類型(Value Type): 可以是任何類型,你想得到的都能實現。
// 初始化一個空的 map
personAge := make(map[string]int) // 鍵是 string,值是 int
// 在宣告時同時給予初始的鍵值對
personAge := map[string]int{
"Alice": 25,
"Bob": 30,
}
在使用 map 前,我們需要初始化它。通常透過
make()
函數來建立一個映射。你也可以直接使用字面量來初始化一個映射。
Note:使用make()
的詳細資訊,請參考 第8天的教學文。
// 宣告並初始化一個映射
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{}{}
又是做什麼用途?