#go
#Вперед
Вопрос:
package main
import "fmt"
type State string
const (
// PASS check passed.
PASS State = "PASS"
// FAIL check failed.
FAIL = "FAIL"
// WARN could not carry out check.
WARN = "WARN"
// INFO informational message
INFO = "INFO"
// SKIP for tests skipped
SKIP = "SKIP"
)
// SummaryLevelWise is a summary of results of control checks run CIS Levelwise
type Something struct{
SummaryLevelWise map[string]*Summary
}
// Summary is a summary of the results of control checks run.
type Summary struct {
Pass int `json:"total_pass"`
Fail int `json:"total_fail"`
Warn int `json:"total_warn"`
Info int `json:"total_info"`
Skip int `json:"total_skip"`
}
func main() {
s := amp;Something{}
s.doingSomething()
// This is one way I tried to update the map[string]*struct variable
s.SummaryLevelWise["1"].Pass, s.SummaryLevelWise["1"].Fail, s.SummaryLevelWise["1"].Warn, s.SummaryLevelWise["1"].Info, s.SummaryLevelWise["1"].Skip = 0,0,0,0,0
// Another way that didn't work
// s.SummaryLevelWise["1"] = amp;Summary{0,0,0,0,0}
}
func summarizeLevel(summary *Summary) {
switch PASS{
case PASS:
summary.Pass
case FAIL:
summary.Fail
case WARN:
summary.Warn
case INFO:
summary.Info
case SKIP:
summary.Skip
}
}
func(something *Something ) doingSomething(){
level1 := "1"
for i:=0; i<10; i {
summarizeLevel(something.SummaryLevelWise[level1])
}
fmt.Println(something)
}
Ошибка, которую я получаю, является
паника: ошибка времени выполнения: недопустимый адрес памяти или разыменование указателя с нулевым значением [сигнал SIGSEGV: код нарушения сегментации = 0x1 addr = 0x0 pc = 0x1091ac4]
процедура 1 [запущена]: main.summarizeLevel(…) /Users/i345678/go/src/github.concur.com/test/тест/main.go:68 основных.(*Что-то).Что-то делаю (0xc00000c028) /Users/i345678/go/src/github.concur.com/тест/test/main.go: 89 0x64 main.main() /Users/i345678/go/src/github.concur.com/test/test/main.go: 58 0x44 статус выхода 2
Значения строки уровня равны «1» и «2».
Комментарии:
1. У вас неправильный порядок, вызывающий doingSomething перед инициализацией отдельной сводки.
amp;Something{}
вычисляется как указатель наSomething
однако его поле mapnil
ничего не должно говорить об элементах этой карты. play.golang.org/p/kbkNaIdikH9
Ответ №1:
func main() {
s := amp;Something{}
// Intialize map.
s.SummaryLevelWise = map[string]*Summary{}
//s.SummaryLevelWise["1"].Pass, s.SummaryLevelWise["1"].Fail, s.SummaryLevelWise["1"].Warn, s.SummaryLevelWise["1"].Info, s.SummaryLevelWise["1"].Skip = 0,0,0,0,0
s.SummaryLevelWise["1"] = amp;Summary{0,0,0,0,0}
s.doingSomething()
}
карты могут обнуляться. Следовательно, необходимо их инициализировать.