有个 go 的问题,求解答

2020-06-12 10:28:33 +08:00
 lancelock

最近尝试用 gin 写一个个人项目,有个问题就是,因为 golang 里用大小写控制访问权限,所以我定义的 struct 的属性名都是大写的,这样以 json 格式返回后 key 也都是首字母大写的 PascalCase 风格,但我需要 cameCase 风格,有什么办法统一处理吗?

我目前知道可以在定义 struct 的时候加json的 tag,但是一个有点麻烦,另一个就是对于一些第三方依赖包里定义的 struct 就没有办法了,有什么优雅的办法吗?

4582 次点击
所在节点    Go 编程语言
31 条回复
Hanggi
2020-06-12 10:36:48 +08:00
请认真阅读文档:
https://github.com/gin-gonic/gin#model-binding-and-validation

如果遇到路由冲突:
https://hanggi.me/post/golang/wildcard-conflict/

当然好好设计针对 httprouter 的路由规则才是正解。
beiping96
2020-06-12 10:37:25 +08:00
`encoding/json`最优雅
dilu
2020-06-12 11:05:34 +08:00
u1s1,个人项目用 php 一把梭不香嘛 或者你擅长的语言也可以噻
lancelock
2020-06-12 11:09:31 +08:00
@Hanggi 说的不是参数绑定,是返回数据啊,而且这里说的而不也是加 tag 吗
lancelock
2020-06-12 11:11:54 +08:00
@dilu 不会 php
Fitz
2020-06-12 11:16:11 +08:00
加个 tag 有什么麻烦的, 第三方的你只能自己定义一个一样的结构体,把数据拷过来了
eslizn
2020-06-12 11:16:35 +08:00
给第三方 struct 定义别名,并给这个别名实现 Marshaler 接口
lasuar
2020-06-12 11:21:13 +08:00
默认就是和属性名保持一致,没毛病,要驼峰加 tag,这个做法没有问题,你的需求是个性化的。
lasuar
2020-06-12 11:21:59 +08:00
要么自己实现对应接口,那个成本更高
Hanggi
2020-06-12 11:26:47 +08:00
@lancelock 原理是一样的,静态语言就是要把 json 绑定到结构体里。不要想着动态解析它,用不来可以用 nodejs,现在 typescript 开发也都要绑定结构体,一样的。
lancelock
2020-06-12 11:27:30 +08:00
按我的想法,这个可以用一个后置的中间件,handlle 结束后做统一处理,可是没找到现成的,我试试自己写一个吧
qloog
2020-06-12 11:28:28 +08:00
一般的做法是在 struct 的 tag 进行处理,添加 json,里面随便定义,下划线或者驼峰方式都可以。
AlphaTr
2020-06-12 11:30:12 +08:00
对 第三方 struct 应该可以用 reflect 处理
lancelock
2020-06-12 11:31:25 +08:00
@Hanggi 我啥时候要动态解析了,我又什么时候没绑定结构体了?你能不能认真审题
whoami9894
2020-06-12 11:43:20 +08:00
笑死了 #1 #10,一本正经的答非所问

可以找一个自动生成 tag 的结构体生成器,第三方包的话就把字段反射解析出来
dai875939260
2020-06-12 11:47:17 +08:00
https://github.com/fatih/gomodifytags 修改 tag,第三方的包的可以自己再建一个结构体,然后用 mapstructure 转换?
wangyzj
2020-06-12 11:47:18 +08:00
go 这个东西不就是这样
你都习惯别的了还纠结啥 tag
scnace
2020-06-12 11:58:09 +08:00
自己实现一个自用 Marshaller ?
Kisesy
2020-06-12 12:17:48 +08:00
只需要实现 Marshaler 接口并包裹一下(这篇文章中用正则表达式来处理比较低效,需要优化)
https://www.cnblogs.com/chenqionghe/p/13067596.html
mengzhuo
2020-06-12 12:39:55 +08:00
https://json.to-go.online

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX