golang map of interface - panic:在nil map中输入

bn0*_*00d 0 hashmap go slice

我是golang的新手,我正在尝试创建map [string] interface {}类型的地图.

但是当我尝试创建一个不存在的新密钥时,我得到一个运行时错误"恐慌:分配到nil map中的条目".任何人都可以告诉我,我做错了吗?

去PlayGround:https://play.golang.org/p/vIEE0T11yl

这是我的代码:

package main

func main() {
    buffer := Buffer{}
    buffer.AddRecord("myKey", 12345)
}

type Buffer struct {
    records    map[string][]interface{}
}

// ProcessRecord adds a message to the buffer.
func (buffer *Buffer) AddRecord(key string, record interface{}) {
    _, ok := buffer.records[key]
    if !ok {
        buffer.records[key] = make([]interface{}, 0)
    }

    buffer.records[key] = append(buffer.records[key], record)
}
Run Code Online (Sandbox Code Playgroud)

eli*_*rar 8

您需要初始化地图本身:https://play.golang.org/p/wl4mMGjmRP

func (buffer *Buffer) AddRecord(key string, record interface{}) {
    // Check for nil, else initialise the map
    if buffer.records == nil {
        buffer.records = make(map[string][]interface{})
    }
    _, ok := buffer.records[key]
    if !ok {
        buffer.records[key] = make([]interface{}, 0)
    }

    buffer.records[key] = append(buffer.records[key], record)
}
Run Code Online (Sandbox Code Playgroud)

您也可以为结构类型使用构造函数 - 例如NewBuffer(...) *Buffer- 也初始化字段,但在使用它之前检查nil是一个好习惯.访问地图密钥也是如此.