Обновление карты [строка] * структурная переменная в структуре

#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 однако его поле map nil ничего не должно говорить об элементах этой карты. 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()


}
  

карты могут обнуляться. Следовательно, необходимо их инициализировать.