鍍金池/ 問答/GO/ 函數內有聲明好error變量的情況下,使用errors.New()時 panic

函數內有聲明好error變量的情況下,使用errors.New()時 panic: invalid memory address

使用errors.New()時,報panic: runtime error: invalid memory address or nil pointer dereference

func (self *Control) Register(ctx context.Context, in *push.RegisterRequest) (*push.RegisterResponse, error) {
    var err error
    var res = &push.RegisterResponse{
        Code:false,
        Msg:"",
    }
    userInfo, err := service.CheckRegisterParams(ctx, in)
    if err != nil{
    
        res.Msg = err.Error()
        return res, err
    }
 
    if service.IsBlackIp(ctx, in.UserIp){
        res.Msg = "用戶在黑名單中"
        return res, errors.New("用戶在黑名單中")//報painc的錯
        return res, err//不報錯

    }
    err = service.Register(ctx, in.User, in.DeviceNo, in.Ip, in.Port, userInfo)
    if err != nil{
    
        res.Msg = err.Error()
        return  res, err
    }
    res.Code = true
    res.Msg = "OK"
    return res, nil
}

詳細報錯信息如下:

--- FAIL: TestRegiser (0.01s)
    session_test.go:70: fail, rpc error: code = Unknown desc = 用戶在黑名單中
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x14730d0]

goroutine 5 [running]:
testing.tRunner.func1(0xc4201923c0)
    /usr/local/Cellar/go/1.10/libexec/src/testing/testing.go:742 +0x29d
panic(0x15028e0, 0x18f2c40)
    /usr/local/Cellar/go/1.10/libexec/src/runtime/panic.go:505 +0x229
 session/test.TestRegiser(0xc4201923c0)
    /Users/xxxx/devsoft/go/src/session/test/session_test.go:72 +0x270
testing.tRunner(0xc4201923c0, 0x15d2e78)
    /usr/local/Cellar/go/1.10/libexec/src/testing/testing.go:777 +0xd0
created by testing.(*T).Run
    /usr/local/Cellar/go/1.10/libexec/src/testing/testing.go:824 +0x2e0
回答
編輯回答
柒喵

找到原因了,是我的鍋,調grpc如果返回error,前面那個變量*push.RegisterResponse,就默認返回nil,然后我在測試里試圖訪問以res.Msg的形式獲取錯誤信息,res是nil,就有了invalid memory address or nil pointer dereference的錯

2017年11月19日 14:06