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

相关推荐
C语言魔术师12 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
匹马夕阳1 小时前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?1 小时前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
桂月二二8 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
Ai 编码助手8 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
hunter2062069 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb9 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角9 小时前
CSS 颜色
前端·css
九酒9 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae
浪浪山小白兔10 小时前
HTML5 新表单属性详解
前端·html·html5