这种恐慌的原因是什么?

时间:2015-03-15 22:52:40

标签: go

我是Go的新手,有人可以帮我诊断这个问题。

type ValidationStatus struct {
    Passed bool
    Errors map[string]*ValidationError
}

// ...

status := ValidationStatus{Passed: true}

// ...

status.Passed = false
fmt.Println(reflect.TypeOf(typeField.Name)) // string
fmt.Println(reflect.TypeOf(validationError)) // *validation.ValidationError   
status.Errors[typeField.Name] = validationError // Panic triggered here.

validationError在验证包中定义。此代码与结构文件位于同一文件中。

这是我第一次遇到这样的问题,我想我可能会错误地使用地图但是我不明白为什么这不会导致编译错误所以可能是类型问题?任何解决这个问题的指针都会非常感激。

2 个答案:

答案 0 :(得分:5)

您没有告诉我们错误消息是什么!

  

Map types

     

使用内置函数make创建一个新的空映射值   将地图类型和可选容量提示作为参数:

make(map[string]int)
make(map[string]int, 100)

例如,

status := ValidationStatus{Passed: true, Errors: make(map[string]*ValidationError)}

答案 1 :(得分:3)

您的地图为nil。你只需要初始化它。这就是大多数对象初始化隐藏在函数后面的原因:

status := ValidationStatus{Passed: true, Errors: make(map[string]*ValidationError)}

..或者,在函数后面:

status := NewValidationStatus()

// ...

func NewValidationStatus() ValidationStatus {
    return ValidationStatus{
        Passed: true,
        Errors: make(map[string]*ValidationError),
    }
}

See it on the playground