一个是数据id ,一个是状态值,是一个数据状态更新接口,没想到:
go
interface conversion: interface {} is float64, not int64
D:/ /golang.org/toolchain@v0.0.1-go1.25.0.windows-amd64/src/runtime/iface.go:275 (0x7ff626c37604)
panicdottypeE: panic(&TypeAssertionError{iface, have, want, ""})
D:/Office/codes/gocodes/chuangn/chuangnong/app/business/laboratory/rule.go:124 (0x7ff627a3dbc5)
(*Rule).PutUpdate: ruleId := parameter["rule_id"].(int64)
于是乎直接问大模型了 ,大致原因就是 :Go 的 encoding/json 包在解码 JSON 数字时, 默认使用 float64 类型 存储所有数字,无论是否有小数点。
其实这次我偷懒了,没有提前定义请求结构体,
go
type UpdateStatusRequest struct {
ID int64 `json:"id"`
Status int `json:"status"`
}
func (api *AlarmRule) PostUpdate_status(c *gin.Context) {
body, _ := io.ReadAll(c.Request.Body)
// 创建 decoder 并设置 UseNumber
decoder := json.NewDecoder(bytes.NewReader(body))
decoder.UseNumber() // ✅ 关键:使用 json.Number
var req UpdateStatusRequest
if err := decoder.Decode(&req); err != nil {
results.Failed(c, "参数解析失败", err)
return
}
// 现在 req.ID 和 req.Status 是正确的 int 类型
// 可以直接使用
results.Success(c, "更新成功", nil, nil)
}