我正在查看golang验证器并希望了解如何一起验证两个字段?
我正在通过请求发送一个json主体并将主体解码为此结构。在身体中的两个参数(ID1和ID2)中,必须存在其中一个参数。所以,我想验证两者都不存在的情况。
type IDs struct {
ID1 int64 `json:"id_one"`
ID2 int64 `json:"id_two"`
}
如何使用此软件包验证? https://godoc.org/gopkg.in/validator.v2
我查看了文档但无法找到方法。
我能做到
type IDs struct {
ID1 int64 `json:"id_one" validate:"min=0"`
ID2 int64 `json:"id_two" validate:"min=0"`
}
但这仍然让两者都缺席,而其中一个应该存在。
如果不能使用此软件包,还有其他方法吗?
答案 0 :(得分:3)
您可以使用自定义验证功能。
游乐场 - https://play.golang.org/p/vYtp5xKakJ
package main
import (
"errors"
"fmt"
validator "gopkg.in/validator.v2"
)
var atLeastOneIntValues []interface{}
func atLeastOneInt(v interface{}, param string) error {
atLeastOneIntValues = append(atLeastOneIntValues, v)
if len(atLeastOneIntValues) == 2 {
for _, value := range atLeastOneIntValues {
if value.(int64) != 0 {
return nil
}
}
return errors.New("At least one non-empty value should be presented")
}
return nil
}
type IDs struct {
ID1 int64 `json:"id_one" validate:"atleastoneint"`
ID2 int64 `json:"id_two" validate:"atleastoneint"`
}
func main() {
validator.SetValidationFunc("atleastoneint", atLeastOneInt)
fmt.Printf("%v", validator.Validate(IDs{}))
}
答案 1 :(得分:0)
这是你想要的吗?
import (
"fmt"
"github.com/bytedance/go-tagexpr/validator"
)
func Example() {
var vd = validator.New("vd")
type InfoRequest struct {
Name string `vd:"($!='Alice'||(Age)$==18) && regexp('\\w')"`
Age int `vd:"$>0"`
}
info := &InfoRequest{Name: "Alice", Age: 18}
fmt.Println(vd.Validate(info) == nil)
}
https://github.com/bytedance/go-tagexpr/tree/master/validator
答案 2 :(得分:-1)
对于没有直接&方便的适合,最好编写一个自己的验证功能并完成它。在处理方面 - 使用包不会使事情变得更有效率,因为某些代码最终需要做同样的检查!