为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
侃侃无极 2023-06-05 09:16:37
我必须让结构说 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 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您编写的代码在编译时不会弹出 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 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)

}


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信