在golang中一起验证struct的两个字段

时间:2017-10-05 00:36:50

标签: go

我正在查看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"`
}

但这仍然让两者都缺席,而其中一个应该存在。

如果不能使用此软件包,还有其他方法吗?

3 个答案:

答案 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)

对于没有直接&方便的适合,最好编写一个自己的验证功能并完成它。在处理方面 - 使用包不会使事情变得更有效率,因为某些代码最终需要做同样的检查!