type slice struct {
ptr *array // 指到底層陣列的指標
len int // 長度
cap int // 容量
}
🔎 陷阱:
🔎 陷阱:
value, ok := m[key]
的內建語義特性 | slice | map |
---|---|---|
存取時間 | O(1) by index | O(1) 平均 by key |
查找是否存在 | O(n) 線性 | O(1) 平均,需 ok 檢查 |
有序性 | ✅ 有序 | ❌ 無序 |
記憶體利用 | 緊湊,高快取命中率 | 需 hash 結構,記憶體成本較大 |
適合場景 | 排序處理、順序遍歷、大量掃描 | 去重、分組、快查、快取 |
map[string]*User
快速 ID 查詢type User struct {
ID int
Name string
}
var users []User
var index = map[int]*User // 快速透過 ID 查
Slice 跟 Map 的層次理解:
作者在了解 slice 跟 map 時 和 MySQL/Redis
有點搞混,以下寫給初學者,方便釐清不從名詞意義
層次 0:比喻先行(幫助快速直覺)
層次 1:程式語言層(In-memory data structures)
層次 2:序列化與存取(Serialization/IO)
層次 3:儲存與索引引擎(Storage & Indexing Engines)
層次 4:應用系統與架構(Application & Architecture)
為什麼不能直接拿 slice/map 跟 MySQL/Redis 比?
如何在腦中建立層次,避免搞混?
簡短對照表
小結:
小作業:可以自行嘗試:把一個 Go struct 切片序列化為 JSON 寫檔,再讀回來放到 slice/map,讓「層次 1→2→1」的過程變得可見。