golang map的坑

当结构体的某个成员是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)   
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容