Go 语言处理 int64 空值技巧
本文旨在解决Go语言中使用encoding/json包解析JSON数据时,遇到的int64类型字段值为null的问题。我们将探讨如何使用指针类型*int64来优雅地处理JSON中的null值,并提供示例代码和注意事项,帮助开发者更好地处理此类情况。

在 Go 语言中使用 encoding/json 包解析 JSON 数据时,经常会遇到 int64 类型的字段值为 null 的情况。直接将 null 值 unmarshal 到 int64 类型的变量会导致错误,因为 int64 类型无法表示 null。本文将介绍一种有效的解决方案:使用 *int64 指针类型。
使用 *int64 指针类型
Go 语言中的指针类型可以表示一个值的地址,也可以为 nil。 因此,我们可以使用 *int64 类型来表示一个可能为 null 的 int64 值。 当 JSON 中的值为 null 时,*int64 类型的变量会被 unmarshal 为 nil;当 JSON 中的值为一个有效的 int64 数字时,*int64 类型的变量会指向一个包含该数字的 int64 值。
下面是一个示例代码:
package main
import (
"encoding/json"
"fmt"
)
var d = []byte(`{ "world":[{"data": 2251799813685312}, {"data": null}]}`)
type jsonobj struct {
World []World
}
type World struct {
Data *int64 `json:"data"`
}
func main() {
var data jsonobj
jerr := json.Unmarshal(d, &data)
fmt.Println(jerr)
fmt.Println(data)
// 访问数据
for _, w := range data.World {
if w.Data == nil {
fmt.Println("Data is null")
} else {
fmt.Println("Data:", *w.Data) // 注意:需要解引用指针
}
}
}代码解释:
- *`type World struct { Data int64 `json:"data"` }**: 我们将Data字段的类型从int64修改为*int64。json:"data"tag 确保 JSON 解析器能正确地将 JSON 中的 "data" 字段 unmarshal 到Data` 字段。
- if w.Data == nil { ... } else { ... }: 在访问 Data 字段的值之前,我们需要检查它是否为 nil。 如果是 nil,则表示 JSON 中的值为 null。
- *`fmt.Println("Data:", w.Data)**: 如果Data字段不为nil,则我们需要使用*` 运算符来解引用指针,以获取实际的 int64 值。
运行结果:
{[{0x1400011a000} { }]} Data: 2251799813685312 Data is null
可以看到,null 值被成功地 unmarshal 为 nil,并且我们可以通过判断指针是否为 nil 来确定 JSON 中的值是否为 null。
注意事项
解引用指针前必须检查 nil: 在使用 *int64 类型的变量之前,务必先检查它是否为 nil,否则会导致 panic。
默认值: 如果希望将 null 值转换为特定的默认值(例如 -1),可以在 unmarshal 后进行手动处理。 例如:
for i := range data.World { if data.World[i].Data == nil { defaultValue := int64(-1) data.World[i].Data = &defaultValue } }
总结
使用 *int64 指针类型是处理 JSON 中 int64 类型字段值为 null 的一种有效方法。 它可以让我们在 Go 语言中优雅地处理 null 值,并避免 unmarshal 错误。 通过本文提供的示例代码和注意事项,相信你能够更好地处理 JSON 数据中的 null 值。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















