我已经用Go写了很长时间了,最近在重写代码时,我遇到了一件奇怪的事情。我做了几次测试,if request == nil
检查没有成功。以前,我总是害怕得到一个nil
指针异常,所以我到处插入检查。但是在这种情况下,json
解码错误处理程序似乎涵盖了所有情况。
var (
request *models.Owner
err error
)
err = json.NewDecoder(r.Body).Decode(&request)
if err != nil {
render.Render(w, r, response.ErrInvalidRequest(err))
return
}
if request == nil {
render.Render(w, r, response.ErrInvalidRequest("request is nil"))
return
}
if request == nil
有可能捕捉到这个吗?也许这个检查是不必要的,如果我在我的项目中删除这个检查,代码将变得更干净。
有可能返回nil
错误,request
仍然是nil
,但前提是输入的JSON是JSONnull
值。
例如:
type Owners struct {
Name string
}
var request *Owners
if err := json.Unmarshal([]byte("null"), &request); err != nil {
panic(err)
}
fmt.Println(request == nil)
fmt.Println(request)
这将输出(在Go Playground上试试):
true
<nil>
json.Unmarshal()
:
要将JSON解封为指针,unmarshal首先处理JSON文本为null的情况。在这种情况下,Unmarshal将指针设置为nil。否则,Unmarshal将JSON反编组为指针指向的值。如果指针为nil,则Unmarshal分配一个新值供其指向。