2015-03-15 7 views
0

Я довольно новичок, чтобы пойти, может кто-нибудь помочь мне диагностировать эту проблему.В чем причина этой паники?

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 определен в пакете проверки. Этот код находится в том же файле, что и структура.

Это первый раз, когда я столкнулся с такой проблемой, я думаю, что могу использовать карту неправильно, но потом я не понимаю, почему это не вызвало бы ошибку компиляции, а может быть, проблему с типом? Любые указатели для решения этой проблемы будут высоко оценены.

+3

Для дальнейшего использования, если вы спрашиваете о паника, то обязательно включите фактическое сообщение о панике. –

+1

См. Https://blog.golang.org/go-maps-in-action для ознакомления с картами в Go. – dyoo

ответ

5

Вы не сказали нам, что сообщение об ошибке было!

Map types

новое пустое значение карты производится с помощью встроенной функции марку, которая принимает тип карты и дополнительные емкости подсказки в качестве аргументов:

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

Например,

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

Y наша карта nil. Вам просто нужно инициализировать его. Вот почему большинство инициализации объекта скрывается за функции:

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

..or, за функции:

status := NewValidationStatus() 

// ... 

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

See it on the playground

Смежные вопросы