英文:
golang map of interface - panic: assignment to entry in nil map
问题
我是你的中文翻译助手,以下是你要翻译的内容:
我是golang的新手,我正在尝试创建一个类型为map[string]interface{}的映射。
但是当我尝试在键不存在时创建一个新键时,我会得到一个运行时错误"panic: assignment to entry in nil map"。有人可以告诉我我做错了什么吗?
Go 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将一条消息添加到缓冲区。
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)
}
英文:
I am new to golang and I am trying to create a map of type map[string]interface{}.
But when I try to create a new key when it doesn't exists, I get a runtime error "panic: assignment to entry in nil map". Can anyone tell me what I am doing wrong please?
Go PlayGround: https://play.golang.org/p/vIEE0T11yl
Here is my code:
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)
}
答案1
得分: 11
你需要初始化地图本身:https://play.golang.org/p/wl4mMGjmRP
func (buffer *Buffer) AddRecord(key string, record interface{}) {
// 检查是否为nil,否则初始化地图
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是一个好的做法。对于访问地图键也是一样的。
英文:
You need to initialise the map itself: 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)
}
You could also use a constructor for your struct type - e.g. NewBuffer(...) *Buffer
- that initialises the field as well, but it's good practice to check for nil before using it. Same goes for accessing map keys.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论