使用 json 包解码指针值后是不是需要添加 nil 检查?

Posted

技术标签:

【中文标题】使用 json 包解码指针值后是不是需要添加 nil 检查?【英文标题】:Do I need to add nil check after decoding a pointer value with the json package?使用 json 包解码指针值后是否需要添加 nil 检查? 【发布时间】:2021-12-06 06:17:21 【问题描述】:

我用 Go 写了很长时间,最近在重写代码时,我遇到了一件奇怪的事情。我做了几个测试,if request == nil check 从来没有奏效。以前,我总是害怕得到nil 指针异常,所以我到处插入检查。但在这种情况下,json decode 错误处理程序似乎涵盖了所有情况。

    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 有可能抓住这个吗?也许这个检查是不必要的,如果我在我的项目中去掉这个检查,代码会变得更干净。

【问题讨论】:

【参考方案1】:

可能会返回 nil 错误,而 request 仍将是 nil,但前提是输入 JSON 是 JSON null 值。

例如:

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 为 JSON 文字 null 的情况。在这种情况下,Unmarshal 将指针设置为 nil。 否则,Unmarshal 将 JSON 解组为指针指向的值。如果指针为 nil,Unmarshal 为其分配一个新值来指向。

【讨论】:

以上是关于使用 json 包解码指针值后是不是需要添加 nil 检查?的主要内容,如果未能解决你的问题,请参考以下文章

SAXParser - 从 XML 元素解码值后,仅获得字符长度 126

匹配属性值后添加新的兄弟节点

如何从数据库特定的选定值添加到解码的 Json 数组

如何使用 PHP 解码带有注释的 JSON 文件? [复制]

Json 解码 Sharedpreferences 返回 List<dynamic> 而不是 List<Contact>

用 Go 解析复杂 JSON 的思路