dictionary - 分配给 nil 映射中的条目

标签 dictionary go instantiation

我正在尝试将值分配给在 init 函数中初始化的映射。

但是 panic 发生了: 分配给 nil 映射中的条目

package main

type Object interface { 
}

type ObjectImpl struct {
}

type Test struct{
    collection map[uint64] Object
}

func (test Test) init(){
    test.collection = make(map[uint64] Object)
}

func main() {
    test := &Test{}
    test.init()
    test.collection[1]=&ObjectImpl{}
}

https://play.golang.org/p/yOwXzDkWIo

最佳答案

该函数将 Test 作为值,因此它获得了它自己的副本。当函数返回时,对 test Test 的所有更改都将消失。改为通过指针进行 Test:

func (test *Test) init(){
    test.collection = make(map[uint64] Object)
}

请注意,结构 Test 已导出,方法 init 未导出,因此您的库的用户可能会创建一个 Test但没有正确初始化它。似乎 go 社区已经建立了一个独立的 NewType 方法的约定:

type test struct{
    collection map[uint64] Object
}

function NewTest() *test {
    return &test{
        collection: make(map[uint64] Object),
    }
}

这确保用户只能通过调用 NewTest 获得一个 test 并且它将按预期进行初始化。

关于dictionary - 分配给 nil 映射中的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39064239/

相关文章:

go - 如何在golang中间件中获取Response statusCode?

go - Go 练习之旅 #18 : Slices

python - 从列表中删除字典

python - 是否有更紧凑的方法将一系列 (key,value) 元组转换为 {key :[value, ..],..} 字典?

c# - 内存索引

java : why is it safe to modify a map's entry's value while we are iterating over it?

google-app-engine - GAE Go——异步数据存储 API?

c# - 我将如何每 5 到 7 秒实例化一个对象?

javascript - 通过触发器实例化 Backbone? (或者如何推迟匿名函数的执行?)

c++ - 显式模板实例化的 gcc 问题?