分配给 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{}
}
该函数将 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
对象从未获得初始化映射。
我正在尝试为在 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{}
}
该函数将 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
对象从未获得初始化映射。