Golang,nil指针取消引用或无效的内存地址

时间:2016-05-24 23:31:28

标签: http go concurrency

我的代码完美运行,直到我想使用许多并发调用来扩展它。它的工作原理是向客户询问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

1 个答案:

答案 0 :(得分:2)

首先,您可以通过检查您当前忽略的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的结果编辑您的问题并进行实施,我会进一步调查。