在Golang中一起验证两个结构字段

I was looking at golang validators and want to know how I can validate two fields together?

I am sending a json body over a request and decoding the body into this struct. Of the two parameters in the body(ID1 & ID2), one of them must be present. So, I want to validate the case where both aren't present.

type IDs struct {
    ID1 int64 `json:"id_one"`
    ID2 int64 `json:"id_two"`
}

How would I validate this using this package? https://godoc.org/gopkg.in/validator.v2

I went through the doc and couldn't find a way to do it.

I can do

type IDs struct {
    ID1 int64 `json:"id_one" validate:"min=0"`
    ID2 int64 `json:"id_two" validate:"min=0"`
}

but this still lets both to be absent, instead one of them should be present.

If it cant be done with this package, what are the other ways to do this?

You can use custom validation function.

Playground - 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{}))
}

For cases which don't have a direct & convenient fit, it may be better to write one's own validation function and be done with it. In terms of processing - using the package isn't going to make things any more efficient, as some code somewhere finally needs to do the same checking anyways!

Is this what you want?

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