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

相关推荐
大怪v4 小时前
AI抢饭?前端佬:我要验牌!
前端·人工智能·程序员
新酱爱学习4 小时前
字节外包一年,我的技术成长之路
前端·程序员·年终总结
小兵张健4 小时前
开源 playwright-pool 会话池来了
前端·javascript·github
IT_陈寒7 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
codingWhat8 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
代码老中医8 小时前
2026年CSS彻底疯了:这6个新特性让我删掉了三分之一JS代码
前端
不会敲代码18 小时前
Zustand:轻量级状态管理,从入门到实践
前端·typescript
踩着两条虫8 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能
扉川川8 小时前
OpenClaw 架构解析:一个生产级 AI Agent 是如何设计的
前端·人工智能
远山枫谷8 小时前
一文理清页面/组件通信与 Store 全局状态管理
前端·微信小程序