想像你有一串珠子,按照順序擺好。你可以馬上拿出第 1 顆、第 2 顆。這就是 slice:一個有順序的動態陣列。
fruits := []string{"apple", "banana", "grape"}
fmt.Println(fruits[0]) // apple
👉 找第幾顆很快,但要找「有沒有紅色珠子」只能一個一個看。
map 就是「鍵值配對」,像電話簿一樣:用名字(key)找號碼(value)。
phonebook := map[string]string{
"Alice": "1234",
"Bob": "5678",
}
number, ok := phonebook["Alice"]
if ok {
fmt.Println("Alice 的電話:", number)
} else {
fmt.Println("找不到這個名字")
}
👉 用名字就能直接翻到頁碼 → 很快!但每次順序不一定。
s := []int{1, 2, 3}
m := map[string]int{"dozen": 12}
v, ok := m["dozen"] // ok 表示有沒有找到
for _, v := range s {
fmt.Println(v)
}
ok
?想像學生成績表:
grades := map[string]int{"Tom": 0}
g, ok := grades["Tom"]
fmt.Println(g, ok) // 0 true (Tom有,只是零分)
g2, ok2 := grades["Amy"]
fmt.Println(g2, ok2) // 0 false (Amy根本沒這個人)
👉 沒有 ok,就會混淆「零分」跟「不存在」。
特性 | slice(串珠) | map(電話簿) |
---|---|---|
是否有序 | ✅ 有序 | ❌ 無序 |
存取速度 | 按位置 O(1) | 按 key O(1) |
查找方式 | 按值找 = O(n) | 檢查存在 = O(1) |
用途 | 排序、遍歷 | 快速查詢、計數、分組 |
ok
。func Units() map[string]int {
return map[string]int{
"dozen": 12,
"gross": 144,
}
}
👉 用「名稱 → 數量」的對照表,是 map 的最佳舞台。