分配给 nil 映射中的条目

assignment to entry in nil map

我正在尝试为在 init 函数中初始化的映射赋值。

但是出现了恐慌: 分配给 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 作为值,因此它获得了它自己的副本。当函数 returns 时,对 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 并且它将按预期进行初始化。

您应该为 init 方法使用指针接收器:

func (test *Test) init() {  // use a pointer to test
    test.collection = make(map[uint64] Object)
}

如果没有指针,您正在为 test 对象的副本初始化映射。实际的 test 对象从未获得初始化映射。

Working Code