nil map 可以讀但不能寫
var x map[string]int宣告出來的是 nil map:它有型別、可以讀、可以len、可以range,但一寫入就 panic。
func main() {
var x map[string]int
x["Test"] = 10 // panic: assignment to entry in nil map
}原因是 var 只宣告了「x 是一個 map」,還沒有任何雜湊表被配置出來——沒有記憶體可以放這組 key-value。讀取之所以不會炸,是因為讀不到就回傳 zero value,不需要動到任何記憶體。
| 對 nil map 做 | 結果 |
|---|---|
len(x) | 0 |
x["k"] | 回傳 value 型別的 zero value |
for range x | 直接跳過,不執行 |
delete(x, "k") | 沒事(no-op) |
x["k"] = 1 | panic |
這是 map 與 nil slice 最大的不對稱:nil slice 可以直接 append(append 會替它配置),nil map 卻不能寫。原因是 append 有回傳值、可以把新配置的位址交回給呼叫端,而 x["k"] = 1 這個語法沒有地方回傳新的 map。
所以 map 一定要先配置再用,見 Go 建立 map 的三種寫法。