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 中。

相关推荐
chushiyunen3 分钟前
未设置X-XSS-Protection响应头安全漏洞
前端·xss
文心快码BaiduComate6 分钟前
Comate Spec模式实测:让AI编程更精准可靠
前端·后端·前端框架
菥菥爱嘻嘻10 分钟前
组件测试--React Testing Library的学习
前端·学习·react.js
豆苗学前端12 分钟前
HTML + CSS 终极面试全攻略(八股文 + 场景题 + 工程落地)
前端·javascript·面试
珑墨32 分钟前
【迭代器】js 迭代器与可迭代对象终极详解
前端·javascript·vue.js
Fantastic_sj40 分钟前
[代码例题] var 和 let 在循环中的作用域差异,以及闭包和事件循环的影响
开发语言·前端·javascript
HashTang1 小时前
【AI 编程实战】第 3 篇:后端小白也能写 API:AI 带我 1 小时搭完 Next.js 服务
前端·后端·ai编程
三年三月1 小时前
React 中 CSS Modules 详解
前端·css
粉末的沉淀1 小时前
tauri:关闭窗口后最小化到托盘
前端·javascript·vue.js
赵庆明老师1 小时前
NET 使用SmtpClient 发送邮件
java·服务器·前端