Http Golang,零指针解引用或无效内存地址
我的代码可以完美地工作,直到我想使用许多并发调用来扩展它。它通过向客户机请求Get请求来工作 这就是我得到的: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
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
mGetUser
。它似乎与并发无关——也许您现在看到它只是因为您的并发版本对GetUser
进行了更多调用。