遇到的问题
如果定义的接收结构体字段是interface{},在调用gin的 c.BindJSON 方法后会直接转为map, 导致无法断言为其他类型
场景
在创建工程请求中,根据工程类别的不同会有多种创建参数,比如
// A 类型需要编译 所以有这些字段
type ProjTypeA struct{
buildCmd string `json:"build_cmd"` // 编译命令
buildScript string `json:"build_script"` // 编译脚本
}
// B 类型直接执行,需要这些字段
type ProjTypeB struct{
ExecCmd string `json:"exec_cmd"` // 执行命令
}
因为以后可能会扩展出更多类型的工程,所以考虑用多态来实现对工程子参数的处理,这样以后新增工程类型只需要新类型实现TypePara接口即可,尽量减少对主干代码的修改。甚至无需修改creatproj函数,只要修改接口里的判断方法就行(因为前端请求过来的json要通过业务逻辑判断后才能知道反序列化为哪个工程类型)
前端传请求体时会把这些不同的结构统一写入TypePara这个字段中,这里的处理有两种情况:
- 在后端接收时这个字段设为interface{},用下方定义的PostProjReq来接收。
type PostProjReq struct {
Name string `json:"name"`
Desc string `json:"desc"`
TypePara interface{
} `json:"type_para"`
}
此时再通过c.BindJSON接收
pp := new(api.PostProjReq)
if err := c.BindJSON(*pp); err != nil {
log.Println("json unmarshal error: ", err)
c.JSON(http.StatusOK, api.HttpRespBody{
Code: