2016-08-21 33 views
0

我想分配值在init func中初始化的映射。分配到无地图条目

但是出现恐慌: 分配进入未缴地图

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

回答

2

该函数Test的价值,所以它得到的它自己的副本。当函数返回时,对test Test的所有更改都将消失。通过指针以Test代替:

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

不过要注意,该结构Test出口,该方法init不大,因此库的用户可能会创建一个Test但不正确初始化它。这似乎是围棋界已建立了独立NewType方法的约定:

type test struct{ 
    collection map[uint64] Object 
} 

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

这确保了用户只能通过调用NewTest获得test和预期将被初始化。

+0

非常有意义,我不能相信我没有意识到这一点我自己。谢谢你的答案和额外的一双眼睛。 – Aidamina

1

你应该使用指针接收器的init方法:

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

没有指针,要初始化地图为test对象的副本。实际的test对象永远不会获得初始化的映射。

Working Code