从隔壁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?

讨论数量: 17

不知道是不是我理解的那个意思 可以使用github.com/jinzhu/copier组件来进行model参数->api返回值的同名参数转换

//api返回参数
type Resp struct {
    Id   string `json:"resp_id"`
    Name string `json:"resp_name"`
}
//数据库model
type User struct {
    Id   string `gorm:"id"`
    Name string `gorm:"name"`
    Age  string `gorm:"age"`
}
var resp Resp
//查询出结果
user :=  User{
    Id:   "id",
    Name: "1",
    Age:  "2",
}

copier.Copy(&resp,&user)
fmt.Printf("%+v",resp)
2年前 评论
dongjy 2年前
storyflow 2年前

没搞懂。php transfomer/resource处理返回的数据的时候,不也是需要一对一赋值吗?

2年前 评论
hiword 2年前

@Mr-houzi php 不一样。php可以很[灵活]的 merge进去一个数组里
还有magic method辅助,接口有JsonSerializable.

就是突然一下子不知道这些东西在go里咋搞。比如php我现在 return new xxxresponse($usermodel,$articlemodel)
我内部实现可能是 $userModel->toArray() 或者 $userModel->only() 我还能支持 $userModel->get('field as field2')

有没有什么奇技淫巧

2年前 评论
Mr-houzi 2年前
cevin (作者) (楼主) 2年前
Mr-houzi 2年前
cevin (作者) (楼主) 2年前
Mr-houzi 2年前
dongjy 2年前
giao哥

你可以看下开源项目是如何定义的

2年前 评论

有同样的疑问。go返回数据,是不是也要创建一个结构体?

2年前 评论

你这个问题,我最开始也遇到过,我写了一个反射类似的,过做你的transformer层,可以参考:github.com/firmeve/firmeve/blob/de...

但是后来我果断放弃这种做法,你的朋友说的对,一个一个手动赋值

从php转到go了就不要再强制把php的那一套搬到go上,每个语言都有自己的特点

2年前 评论

奇技淫巧,只能想到是用反射包 reflect 来处理.. 但是个人认为复杂,而且降低了代码可读性,还是直接一个个写来的更快一点

2年前 评论

你的朋友说的对,每一个接口的返回格式 都写个结构体去装吧
至少data 的赋值每个接口不一样的话那就 一个接口对应一个结构体
{“code”:200,”msg”:””,”data”:xxx}

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!