pointers - Golang 中无效的内存地址

标签 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,这个错误没有任何意义,所以我想知道我是否是某种指针 hell ,因为创建了一个指针变量,然后将指针分配给它。

我是否应该简单地将 github org 创建为普通结构,然后将 &org 传递给 hunt 函数。我试过了并克服了这个错误,但是大量的其他代码吐了,所以在我开始追查这个之前我想我会问这是否有意义,如果我在错误的地方看。带有链接的 RTFM 总是受欢迎的。

谢谢!

最佳答案

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

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

关于pointers - Golang 中无效的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53400113/

相关文章:

c - C 中 *ptr += 1 和 *ptr++ 的区别

c++11 - 存储指针减法的结果

c++ - ClassName& 作为返回类型是什么意思?

variables - 如何获取有关 Go 变量类型的信息

types - 如何理解两个命名类型在 golang 中是相同的

c++ - 从 dll/共享库返回指针会导致段错误

c++ - 成员函数指针和回调

Golang cookie 的时间戳为空

performance - 在 golang 中,使用 make 与 {} 初始化的 map 之间是否存在任何性能差异

database - 如何在 mongo-go-driver 中添加选项 `writeConcern`?