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

在我的 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,并且可以编译并生成正确的答案。


那么,我该如何解决这个错误呢?


POPMUISE
浏览 62回答 1
1回答

慕慕森

该声明var i int32 = 3.898733e+06有效是因为此表达式中的文字是无类型常量,并且无类型常量是根据上下文计算的。在这种情况下,即使它被写为浮点数,它在编译时也被解释为 int32。这不会在运行时发生。有几个选项可以使它适用于 JSON 封送处理:声明Value为json.Number。通过这种方式,您可以尝试将其解析为 int64,如果失败,则将其解析为 float64,然后转换为 int64,希望您不会失去精度。定义一个自定义类型并自己解组:type LongInt int32func (i *LongInt) UnmarshalJSON(data []byte) error {   // Parse data yourself and set the int value   // Maybe use big.Int?}声明Value为float64
打开App,查看更多内容
随时随地看视频慕课网APP