我已经检查了其他几个答案,他们给了我一些关于如何解决这个问题的好想法,但我还是想不通。
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/