golang map的坑

當結(jié)構(gòu)體的某個成員是map類型, 結(jié)構(gòu)體初始化后map需要單獨初始化,否則對map的操作會
“panic: assignment to entry in nil map”

import (
    "fmt"
)

//panic: assignment to entry in nil map
type Param map[string]interface{}

type Show struct {
    Param
}

func main() {
    s := new(Show)
    //s.Param["RMB"] = 10000 //panic: assignment to entry in nil map
    s.Param = map[string]interface{}{}
    s.Param = Param{}
    s.Param["RMB"] = 10000 
    fmt.Println(s)
}

當結(jié)構(gòu)體的某個成員是指向map類型的指針類型, ,對map的操作可能會發(fā)生如下兩種情況:
1: map未初始化,通過s.Param["RMB"]訪問,會導(dǎo)致"invalid operation: s.Param["RMB"] (type *Param does not support indexing)"
2: map未初始化, 通過s.Param["RMB"]訪問, 對該成員的訪問會導(dǎo)致"panic: runtime error: invalid memory address or nil pointer "
3: map已初始化,通過s.Param["RMB"]訪,會導(dǎo)致"invalid operation: s.Param["RMB"] (type *Param does not support indexing)", 所以對改指針的指向值的訪問需要解引用:

(*s.Param)["RMB"] 
package main
import "fmt"

type Param map[string]interface{}

type Show struct {
    *Param
}

func main() {
    s := new(Show)
    // s.Param["RMB"] = 10000 //invalid operation: s.Param["RMB"] (type *Param does not support indexing)
   // (*s.Param)["RMB"] = 10000 //panic: runtime error: invalid memory address or nil pointer dereference
    p := Param{}
    s.Param = &p
    //s.Param["RMB"] = 100000 //s.Param["RMB"] (type *Param does not support indexing)
    (*s.Param)["RMB"] = 100000
    fmt.Println(s.Param)   
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容