【问题标题】:golang map of interface - panic: assignment to entry in nil map [duplicate]接口的golang映射-恐慌:分配给nil映射中的条目[重复]
【发布时间】:2015-09-18 05:09:26
【问题描述】:

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

但是当我尝试创建一个不存在的新键时,我得到一个运行时错误“panic: assignment to entry in nil map”。谁能告诉我我做错了什么?

去游乐场: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)
}

【问题讨论】:

  • 当我问这个问题时,我不知道我是否错过了初始化,所以我不知道这在技术上是否是重复的。否则,我知道如何在结构中初始化映射,或者在本例中是接口切片的映射。

标签: go hashmap slice


【解决方案1】:

您需要初始化地图本身: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 是一个好习惯。访问地图键也是如此。

【讨论】:

  • 我知道我在做一些非常愚蠢的错误。非常感谢,您为我节省了很多时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2015-01-31
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多