golang map的坑

2020-05-29  本文已影响0人  夜空一起砍猩猩

当结构体的某个成员是map类型, 结构体初始化后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)
}

当结构体的某个成员是指向map类型的指针类型, ,对map的操作可能会发生如下两种情况:
1: map未初始化,通过s.Param["RMB"]访问,会导致"invalid operation: s.Param["RMB"] (type *Param does not support indexing)"
2: map未初始化, 通过s.Param["RMB"]访问, 对该成员的访问会导致"panic: runtime error: invalid memory address or nil pointer "
3: map已初始化,通过s.Param["RMB"]访,会导致"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)   
}
上一篇下一篇

猜你喜欢

热点阅读