Golang Go语言中有没有什么优雅的方法实现 当 req.xx == yy 时 某些参数必须 或转成其他 struct
一个 api 中转系统
当 body json channel==app1 时,data.somekey required 。否则 [必须不传]
其他类似 channel=app2 时 data.somekey2 required 否则 [必须不传]
现在是这么干的
type tmp struct { C string json:"channel"
}
gin.get("/", func... c.bind(C) switch(channel) case xx: return new ChannelXX(c.req)
Golang Go语言中有没有什么优雅的方法实现 当 req.xx == yy 时 某些参数必须 或转成其他 struct
更多关于Golang Go语言中有没有什么优雅的方法实现 当 req.xx == yy 时 某些参数必须 或转成其他 struct的实战教程也可以访问 https://www.itying.com/category-94-b0.html
唔,我重复看了两遍,可是没看懂,你想要表达的意思。
更多关于Golang Go语言中有没有什么优雅的方法实现 当 req.xx == yy 时 某些参数必须 或转成其他 struct的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
somekey, somekey2 的类型改为自己实现的 json.Unmarshaler 然后外面加上自定义验证逻辑?
要优雅的话,可以用 cue
https://cuelang.org/
不太理解这个需求, 为什么要求"必须不传"?
不然直接用 protobuf3 不好吗?
某种程度上来说,就是降低心智负担。某个 channel 的参数白名单是什么,这个 channel 下,其他参数,是不能游泳的,不生效的,所以,干脆就不要传。
http json api 。不想引入太多新东西。
使用 https://github.com/go-playground/validator 校验即可
类似于这种接第三方 api 的应用推荐使用
github.com/go-resty/resty
个人建议是早期先引入此类成熟的工具库,否则后期不好改动,只能硬着头皮去维护了
参考
validated.BindAndValidatePostJson()
type LoginReq struct {
Phone string json:"phone" binding:"omitempty,required_if=Type 1,required_if=Type 2,phone,len=11"
// 手机号
Type int json:"type" binding:"required,oneof=1 2 3 4"
// 1 短信验证码登录 2 账号密码登录
}
这两个并不冲突啊
不能有用的参数接收方不处理不就完了, 不然调用方还要特地区分每个情况下哪个参数能不能传才是心智负担吧
不想引入太多东西往往意味着要自己写更多的东西重新实现现成的轮子的一部分
在Golang中,处理请求参数并根据条件转换或验证参数是一个常见的需求。要实现当 req.xx == yy
时某些参数必须存在或需要转换成其他结构体,你可以采用以下几种优雅的方法:
-
结构体标签和验证库: 使用像
go-playground/validator
这样的库,可以通过结构体标签定义验证规则。当req.xx == yy
时,你可以动态地添加或修改这些验证规则。 -
条件逻辑处理: 在业务逻辑中,根据
req.xx
的值进行条件判断,然后执行相应的参数验证或转换逻辑。这种方法直观但可能稍显冗长。 -
使用接口和类型断言: 定义一个接口来封装不同的请求参数结构,根据
req.xx
的值动态地断言和转换请求体到相应的实现。这种方法增加了代码的灵活性和可扩展性。 -
自定义解析器: 如果请求体是通过JSON解析的,可以编写一个自定义的UnmarshalJSON方法,在该方法中根据
req.xx
的值动态地解析和验证JSON字段。 -
中间件或钩子: 在请求处理流程中使用中间件或钩子,在请求到达业务逻辑之前进行预处理,根据条件调整请求体或验证参数。
选择哪种方法取决于你的具体需求和代码结构。在大多数情况下,结合使用验证库和条件逻辑处理是一种既简单又有效的解决方案。