从隔壁PHP转来的 问个web场景中参数和struct结构和名称不一致的问题
初步学了两三天也玩了玩beego、gin、echo啥的总的来说也都大同小异没啥特别难的坎
就是有个疑问一直觉得很别扭
拿gin & grom来说
reuqest处理
ctx.ShouldBind(&a)
就可以尝试给一个已实例化(姑且这么叫)的对象fill值没报错就fill成功了,非大写开头的还fill不上model和response处理
// 接上面的a db.Where('id =?', ctx.Query(a.Uid)).First(&user)
fill给了user 现在user有值了
假设User是这么定义的
type User struct {
Id uint64
Name string
Gender uint
}
我怎么输出这个User成JSON给接口呢?ok,当然可以在Field上加上Tag变成Id uint64 'json:"id或者uid"'
但是如果我不想直接用model的struct输出呢?我内部业务的结构不想这么改呢?
比如写php的时候可以是返回一个数组对应go的map[string]interface{}
?然后response会经过一层transfomer,实际输出的结构和数据库里的结构是不一样的。
go里面这个怎么写?问了问同转go的phper~~ 告诉我……一个个手动赋值。。。
总结一下:
问题是,go怎么方便的处理 request、model、response 同一个对象三套不同的struct(特指fieldname) 不同的场景。有没有什么奇技淫巧?
比如定义好struct后,把model的struct转json再 Unmarshal(&response.s) ?就成功的用model的值fill给了用于response的struct?
没搞懂。php transfomer/resource处理返回的数据的时候,不也是需要一对一赋值吗?
@Mr-houzi php 不一样。php可以很[灵活]的 merge进去一个数组里
还有magic method辅助,接口有JsonSerializable.
就是突然一下子不知道这些东西在go里咋搞。比如php我现在
return new xxxresponse($usermodel,$articlemodel)
我内部实现可能是
$userModel->toArray()
或者$userModel->only()
我还能支持$userModel->get('field as field2')
有没有什么奇技淫巧
你可以看下开源项目是如何定义的
有同样的疑问。go返回数据,是不是也要创建一个结构体?
你这个问题,我最开始也遇到过,我写了一个反射类似的,过做你的transformer层,可以参考:github.com/firmeve/firmeve/blob/de...
但是后来我果断放弃这种做法,你的朋友说的对,一个一个手动赋值
从php转到go了就不要再强制把php的那一套搬到go上,每个语言都有自己的特点
不知道是不是我理解的那个意思 可以使用
github.com/jinzhu/copier
组件来进行model参数->api返回值的同名参数转换奇技淫巧,只能想到是用反射包 reflect 来处理.. 但是个人认为复杂,而且降低了代码可读性,还是直接一个个写来的更快一点
你的朋友说的对,每一个接口的返回格式 都写个结构体去装吧
至少data 的赋值每个接口不一样的话那就 一个接口对应一个结构体
{“code”:200,”msg”:””,”data”:xxx}