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"] = 1panic

這是 map 與 nil slice 最大的不對稱:nil slice 可以直接 append(append 會替它配置),nil map 卻不能寫。原因是 append 有回傳值、可以把新配置的位址交回給呼叫端,而 x["k"] = 1 這個語法沒有地方回傳新的 map。

所以 map 一定要先配置再用,見 Go 建立 map 的三種寫法

相關:make 只用於 map、slice、channel