Golang中的无效内存地址

时间:2018-11-20 19:22:38

标签: pointers go

我检查了其他几个答案,他们给了我一些有关如何解决此问题的好主意,但我仍然无法弄清楚。

    localID := generateGenericID("local") // type int64
    localName := "local" // type string

    // set them to pointers as I need them as type *int64 and *string
    plocalID := &localID
    plocalName := &localName

    // create a pointer to a new github org
    var org *github.Organization

    // create a new general purpose org
    o := Org{}

    // Check for nil, per several other answers
    if plocalName != nil {
        o.Name = plocalName
        org.Login = plocalName // ERROR
    }

    if plocalID != nil {
        o.ID = plocalID
        org.ID = plocalID
    }

   fmt.Println(*plocalName) // prints local


    hunt.addOrganization(org) // takes a pointer to a github org
    report.addReportOrganization(&o) // take a pointer to an org

我收到的错误消息是:

panic: runtime error: invalid memory address or nil pointer 

它指向标记为ERROR的行。由于我检查了nil,因此该错误没有任何意义,所以我想知道是否由于创建了一个指针变量然后将指针分配给它而使我成为某种类型的指针。

我应该简单地将github org创建为普通结构,然后将&org传递给hunt函数。我尝试了一下并克服了错误,但又遇到了很多其他代码问题,因此在我开始研究之前,我想过要问这是否有意义,如果我找错了地方。始终欢迎带链接的RTFM。

谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码本质上是这样做的:

var org *github.Organization
org.Login = plocalName

org是一个nil指针,它没有指向值,因此org.Login试图取消引用nil指针-因此出现错误。因此,请勿将org声明为指针类型。

您还拥有许多处理指针的不必要代码,例如

plocalID := &localID
..
if plocalID != nil {
    o.ID = plocalID
    org.ID = plocalID
}

在第一行中,您创建了plocalID并使用&localID对其进行了初始化。这样plocalID就不可能成为nil指针,因此进行if plocalID != nil {检查是没有意义的。您可以摆脱plocalID并将代码编写为

o.ID = &localID
org.ID = &localID