Ошибка Go: паника: ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя.Изменение карты внутри структуры, которая присутствует в другой структуре, - PullRequest
0 голосов
/ 29 января 2019

У меня есть структуры, скажем, struct1 и struct2, struct2 содержит карту со struct1, struct1 также содержит карту, я хочу изменить карту, которая присутствует в struct1.

Это вызывает ошибку во время выполнения: паника: ошибка во время выполнения: неверный адрес памяти или разыменование нулевого указателя

type FailureData struct {
    failuresInCommits map[string][]string 
}

type DetectionResults struct {
    Failures map[git_repo.FilePath]*FailureData
        //Have other things
}

func (r *DetectionResults) Fail(filePath git_repo.FilePath, message 
           string, commits []string) {  
        ok := r.Failures[filePath].failuresInCommits //error occurs here    
        if r.Failures[filePath].failuresInCommits == nil {       
            r.Failures[filePath].failuresInCommits = make(map[string][]string)
        }
        if len(ok) == 0 {
            r.Failures[filePath].failuresInCommits[message] = commits
        } else {
            r.Failures[filePath].failuresInCommits[message] = 
               append(r.Failures[filePath].failuresInCommits[message], 
                      commits...)   
        }
}

1 Ответ

0 голосов
/ 29 января 2019

Код, который вы пишете, не выдаст ошибку nil при компиляции. Он вызывает ошибку nil point только при неправильном использовании.

failuresInCommits map[string][]string Вы использовали его после make()?

Failures map[git_repo.FilePath]*FailureData Вы использовали это после 'make ()'?

хорошо, теперь вы сосредоточены на ok := r.Failures[filePath].failuresInCommits, вы убедились, что r.Failures[filePath] возвращает 'failuresIncommits, true',

если нет, то r.Failures [filePath] равен нулю, хорошо, вы скажете мне, что такое nil.failuresInCommits.

, есть также риск, что вы можете только x.failureInCommits в этом конкретномпакет.Если вы сделаете то же самое в каком-то другом пакете, x.failureInCommits будет недоступен из-за ограниченного поля нижнего регистра.

Как сделать?

package main

type FilePath string

type FailureData struct {
    failuresInCommits map[string][]string
}

func NewFailureData() FailureData {
    return FailureData{
        failuresInCommits: make(map[string][]string, 0),
    }
}
func (fd *FailureData) Set(k string, v []string) {
    fd.failuresInCommits[k] = v
}

type DetectionResults struct {
    Failures map[FilePath]*FailureData
    //Have other things
}

func NewDetectionResults() *DetectionResults {
    return &DetectionResults{
        Failures: make(map[FilePath]*FailureData, 0),
    }
}
func (dr *DetectionResults) Set(fp FilePath, fd *FailureData) {
    dr.Failures[fp] = fd
}

func main() {
    fd := NewFailureData()
    dr := NewDetectionResults()
    comments := []string{"push error", "commit error", "add error"}

    fd.Set("hash-18ef8abujce8fad0h8j", comments)
    dr.Set("/etc/go/gopath/src/github.com/xxx/xxx/main.go: 12", &fd)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...