为了账号安全,请及时绑定邮箱和手机立即绑定

将科学概念中的值解组为 Go 中的整数

将科学概念中的值解组为 Go 中的整数

Go
POPMUISE 2022-12-19 20:06:14
在我的 Go 代码中,我正在努力解组我们从端点接收到的 JSON 有效负载。此端点以科学计数法对大值进行编码:type Test struct {    Key   string    Value int32}func main() {    data := []byte("{\"Key\": \"derp\", \"Value\": 3.898733e+06}")    var t *Test    err := json.Unmarshal(data, &t)        fmt.Printf("Error: %v\n", err)    fmt.Printf("Data: %v\n", t)}此处的编码值相当于标准表示法中的 3,898,733。但是,此代码会打印错误:json:无法将数字 3.898733e+06 解组到 int32 类型的 Go 结构字段 Test.Value这是有道理的,因为strconv也无法从字符串中解析此值。但是,我可以做到var i int32 = 3.898733e+06,并且可以编译并生成正确的答案。那么,我该如何解决这个错误呢?
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

该声明var i int32 = 3.898733e+06有效是因为此表达式中的文字是无类型常量,并且无类型常量是根据上下文计算的。在这种情况下,即使它被写为浮点数,它在编译时也被解释为 int32。这不会在运行时发生。

有几个选项可以使它适用于 JSON 封送处理:

  1. 声明Valuejson.Number。通过这种方式,您可以尝试将其解析为 int64,如果失败,则将其解析为 float64,然后转换为 int64,希望您不会失去精度。

  2. 定义一个自定义类型并自己解组:

type LongInt int32


func (i *LongInt) UnmarshalJSON(data []byte) error {

   // Parse data yourself and set the int value

   // Maybe use big.Int?

}

声明Value为float64


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 56 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信