接口(interface)的 golang 映射 - panic : assignment to entry in nil map

标签 go hashmap slice

<分区>

我是 golang 的新手,我正在尝试创建一个类型为 map[string]interface{} 的映射。

但是当我尝试创建一个不存在的新 key 时,我会收到运行时错误“ panic :分配给 nil 映射中的条目”。谁能告诉我我做错了什么?

去 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)
}

最佳答案

您需要初始化 map 本身: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)
}

您还可以为您的结构类型使用构造函数 - 例如NewBuffer(...) *Buffer - 也初始化该字段,但最好在使用前检查是否为 nil。访问 map 键也是如此。

关于接口(interface)的 golang 映射 - panic : assignment to entry in nil map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644293/

相关文章:

java - 为方法调用赋值

Pythonic 方式对列表进行切片元组中的第一个元素

python - Numpy:多维数组值内的比较

Mysql自增Id在使用prepared statements时不按顺序

go - 接口(interface)与结构方法

java - Android - 我们在 HashMap<MyEnum, String> 中使用 enum 作为键代替 String 是否合适?

java - 如何用 HashMap 键填充组合框?

css - 两列 DIV 布局变为一列居中对齐

go - 如何设置默认选择选项以使用 Golang 选择标签?

Golang Oauth2 获取 token 范围