Go语言多态实践以及gin框架c.BindJSON序列化遇到的坑

遇到的问题

如果定义的接收结构体字段是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这个字段中,这里的处理有两种情况:

  1. 在后端接收时这个字段设为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: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值