Go面试题更新 2026-08-05

在 Go 语言中,使用标准库 encoding/json 解析 JSON 数据时,如果未指定具体类型,数值默认会被解析为哪种类型?

技术原理Go

考察说明

考查对 Go 标准库 json 解码默认数值类型行为的掌握。

回答思路

  1. 【回答框架 1】Go 的 encoding/json 包在解码 JSON 数值时,默认将其解析为 float64 类型。这是因为 JSON 规范中的数值没有明确区分整数和浮点数,而 float64 能覆盖整数和浮点数的范围。
  2. 【回答框架 2】解码过程通过 json.Unmarshal 将 JSON 数据映射到 interface{} 时,数值默认变为 float64。例如,JSON 中的 123 会被解析为 123.0,类型为 float64。
  3. 【回答框架 3】当目标结构体字段类型为 int 时,json 包会尝试将 float64 转换为 int,但如果数值超出范围或精度丢失,可能产生错误。因此,精确整数场景建议使用 json.Number 或自定义类型。
  4. 【回答框架 4】如果需要保留原始数值表示,可以使用 json.Decoder 并设置 UseNumber() 方法,这样数值会被解析为 json.Number 类型,避免精度损失。
  5. 【关键点 1】默认解析为 float64,因此大整数可能丢失精度。
  6. 【关键点 2】使用 json.Decoder 的 UseNumber() 可以保留原始数值。
  7. 【关键点 3】结构体字段类型为 int 时,json 会自动转换,但可能溢出报错。
  8. 【易错点 1】错误地认为整数会默认解析为 int,实际上会解析为 float64。
  9. 【易错点 2】忽略精度问题,对大整数直接使用 float64 可能导致数据错误。
  10. 【易错点 3】在需要精确数值时未使用 UseNumber() 或自定义类型。