我的代码可以完美运行,直到我想使用许多并发调用对其进行扩展。通过询问客户一个Get请求来工作。
这就是我得到的:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x400da9]
goroutine 125 [running]:
runtime.panic(0x697480, 0x850d13)
/usr/lib/go/src/pkg/runtime/panic.c:279 +0xf5
main.concurrent(0x25e5)
/home/maker/go/src/GoBot/GoBot.go:19 +0x1a9
created by main.main
/home/maker/go/src/GoBot/GoBot.go:51 +0x224
我认为我没有正确处理该错误,并且在发出很多请求时会崩溃。
func concurrent(n uint64) {
for i := n; i < n+11; i++ {
member, err := s.GetUser(i)
output <- fmt.Sprint(member.Username) //This is line 19 that triggers the error
if err != nil && member != nil {
continue
}
}
defer wg.Done()
}
我该如何解决?
s.GetUser的参考在这里:
https://github.com/njasm/gosoundcloud/blob/master/soundcloud.go#L274
最佳答案
首先,您可以通过检查当前忽略的GetUser
的返回值来防止出现恐慌;
member, err := s.GetUser(i)
if err != nil {
// handle error
}
if member != nil { // prevents the panic attempting to access Username on nil instance of user/member
output <- fmt.Sprint(member.Username) //This is line 19 that triggers the error
if err != nil && member != nil {
continue
}
}
除此之外,
GetUser
在做什么?如果正在执行HTTP GET,则通常应用程序将阻塞直到返回,这意味着,如果您检查错误,则可能会出现HTTP 404、403、500等错误。如果对
GetUser
的调用是并发的,那么您可能会遇到一个问题,其中以下代码尝试在member.Username
返回之前导致GetUser
恐慌而访问nil
,但由于您那里没有goroutine,因此我看不到怎么回事。它应该只是一个简单的阻塞调用。如果您发现上述建议并未导致问题的根本原因,请使用GetUser
的结果及其实现来编辑您的问题,我将对其进行进一步研究。关于http - Golang,nil指针取消引用或无效的内存地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37425554/