golang用any类型去接收前端传的数字类型的值,类型断言为float64

在 Go 中,使用 any 类型接收前端传来的数字时,通常会发现其被类型断言为 float64。这是因为在 JSON 解码的过程中,Go 的 encoding/json 包会将数字解析为 float64。但如果你在结构体中指明字段为 int 类型,框架会根据字段类型进行适当的解析。

  1. 使用 any 类型接收数字
    当你使用 any 类型接收 JSON 数据时:

JSON 解析:Go 的 encoding/json 包将所有数字统一解析为 float64,这是为了兼容整数和浮点数。因为 JSON 中的数字没有类型限制,Go 选择 float64 来最大程度保留数值的范围和精度。

类型断言:因此,当你尝试将接收到的 any 类型的值进行类型断言时,通常会得到 float64。

go 复制代码
var data map[string]any
err := json.Unmarshal([]byte(`{"value": 42}`), &data)
if value, ok := data["value"].(float64); ok {
    fmt.Println(value) // 输出: 42
}
  1. 指明 int 类型解析为 int
    当你在结构体中定义字段为 int 类型时:

字段类型:Go 的 JSON 解码器会根据字段的类型信息进行解析。如果字段是 int,那么解析器会尝试将 JSON 中的数字直接转换为 int 类型。

自动转换:从 JSON 中接收到的整数会被正确地解析为 int,而不会被转换为 float64。

示例

go 复制代码
type QueryParams struct {
    Page  int `json:"page" binding:"required"`
    Limit int `json:"limit" binding:"required"`
}

var params QueryParams
err := json.Unmarshal([]byte(`{"page": 2, "limit": 10}`), &params)
// 此时 params.Page 和 params.Limit 都会是 int 类型

总结

使用 any 类型:接收到的数字会被解析为 float64,因为 JSON 数字没有类型限制,而 Go 选择 float64 以兼容各种数字类型。

指明具体类型:如果字段类型被明确为 int,Go 的 JSON 解码器会将 JSON 中的数字直接解析为 int,无需进行类型断言。

这种机制使得 Go 在处理 JSON 数据时更具灵活性,同时也能保持类型的准确性

Go 的 any 类型:

any 是 Go 1.18 引入的一个新类型,实际上是 interface{} 的别名。它可以持有任何类型的值。当 JSON 解码时,数字会被解析为 float64 类型并存储在 any 中。

相关推荐
web打印社区7 小时前
网页静默打印热敏小票:从 HTML 到出纸的完整指南
前端·javascript·vue.js·electron·pdf·html
剪刀石头布啊8 小时前
设计一个多计时任务的任务管理功能
前端
ModyQyW9 小时前
vite-plugin-uni-manifest 更新了什么
前端·typescript·uni-app
Asize10 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen11 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师12 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马12 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒12 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚13 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲13 小时前
python中的类型标注
前端