Http Golang,零指针解引用或无效内存地址

Http Golang,零指针解引用或无效内存地址,http,go,concurrency,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

我的代码可以完美地工作,直到我想使用许多并发调用来扩展它。它通过向客户机请求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()
}
func并发(n uint64){
对于i:=n;i输出首先,您可以通过检查当前忽略的
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
           }
       }
成员,错误:=s.GetUser(i)
如果错误!=零{
//处理错误
}
if member!=nil{//防止试图访问user/member的nil实例上的用户名时出现恐慌

输出首先,您可以通过检查当前忽略的
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
           }
       }
成员,错误:=s.GetUser(i)
如果错误!=零{
//处理错误
}
if member!=nil{//防止试图访问user/member的nil实例上的用户名时出现恐慌

输出事实上,我正在将函数转换成goroutines。有没有更好的方法来实现它,或者通过检查它来解决它@evanmcdonnal@Juanvulcano我假设您正在调用
concurrent
这样的go例程,比如
go concurrent(10)
,您在
并发
范围内没有goroutines,因此在该范围内没有并发。也就是说,只要检查就可以了,如果根本原因不是
GetUser
中的失败,我会感到惊讶。我使用的是for循环。我做错了吗?@evanmcdonnalI实现了您的代码,它仍然失败。什么原因是吗?事实上,我正在将函数制作成goroutines。有没有更好的方法来实现它,或者通过检查它来解决它@evanmcdonnal@Juanvulcano我假设您正在调用
concurrent
这样的go例程,比如
go concurrent(10)
,您在
并发
范围内没有goroutines,因此在该范围内没有并发。也就是说,只要检查就可以了,如果根本原因不是
GetUser
中的失败,我会感到惊讶。我使用的是for循环。我做错了吗?@evanmcdonnalI实现了您的代码,它仍然失败。什么原因是吗?即使从
GetUser
返回错误,您也在第19行使用
member
。它似乎与并发无关——也许您现在看到它只是因为您的并发版本对
GetUser
进行了更多调用。即使从第19行返回错误,您也在使用
member
m
GetUser
。它似乎与并发无关——也许您现在看到它只是因为您的并发版本对
GetUser
进行了更多调用。