Go 错误:恐慌:运行时错误:无效的内存地址或零指针取消引用。

我必须让结构说 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...)   

        }

}


侃侃无极
浏览 120回答 1
1回答

守着一只汪

您编写的代码在编译时不会弹出 nil 错误。它只会在您以错误的方式使用它时导致 nil 点错误。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,好吧,你告诉我什么是nil.failuresInCommits.还有一个风险是你只能在这个特定的包中使用 x.failureInCommits。如果你在其他一些包中做同样的事情,x.failureInCommits 将无法访问,因为字段小写限制。怎么做 ?package maintype FilePath stringtype 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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go