使用 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
如何使用 PHP 解码带有注释的 JSON 文件? [复制]
Json 解码 Sharedpreferences 返回 List<dynamic> 而不是 List<Contact>