go validator是一个很强大的库,但是它的文档写得实在是垃圾到不能再垃圾,虽然列出了所有支持的key,但是完全没有写清楚value的语法,全靠用户瞎猜,甚至多个命名相似的key也没写清楚区别,key的说明又是直接翻译了key的名字,等于没说,用哪个就全靠用户盲试,有的人可能会说它提供了demo,但它的demo只有基础的几个key,少得可怜,天知道我是怎么试出来“字段要么不存在,要么必须是1或2或3”的语法是"omitempty,oneof=1 2 3"而不是oneof=1|2|3或oneof=[1,2,3]的,感谢ChatGPT,ChatGPT真是人类编程史上最伟大的发明。
字段要么不存在,要么必须是1或2或3
binding:"omitempty,oneof=1 2 3"
字段必须存在
binding:"required"
两个字段必须成对出现
// 注意:required_with后面的值必须和字段名相同,而不是和标签名相同
PageSize *int `form:"page_size" binding:"required_with=PageNum"` // 当前页大小,必须与PageNum成对出现或都不出现
PageNum *int `form:"page_num" binding:"required_with=PageSize"` // 第几页,从1开始,必须与PageSize成对出现或都不出现
两个字段要么都不出现,要么都出现且大于0
// 注意:binding后面的标签是有顺序的,如果写成binding:"omitempty,required_with=Size,gt=0",就变成先校验omitempty,如果传了Size没传Page,也会被omitempty校验通过
// 注意:omitempty是必须的,如果写成binding:"required_with=Size,gt=0",如果没传Size也没传Page,required_with校验通过后,gt校验会不通过
Page *int64 `form:"page" binding:"required_with=Size,omitempty,gt=0"` // 分页查询,第几页(从1开始)
Size *int64 `form:"size" binding:"required_with=Page,omitempty,gt=0"` // 分页查询,每页大小
校验数组里的每个元素
Types []string `form:"types" binding:"dive,oneof=cvm,vmserver"`