當結(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)
}