2017-10-05 9 views
0

私はgolangバリデーターを見ていて、2つのフィールドをどのように検証できるか知りたいですか?構造体の2つのフィールドをgolangで一緒に検証する

私はjsonボディをリクエストに送信し、ボディをこの構造体にデコードしています。本文の2つのパラメータ(ID1 & ID2)のうち、1つが存在する必要があります。だから、私は両方が存在しない場合を検証したい。

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"` 
} 

を行うことができますが、これはまだ代わりに、それらの1つが存在する必要があり、両方が存在しないとすることができます。

このパッケージを使用できない場合、これを行う他の方法は何ですか?

+1

方法。 JSONのunmarshalerは、値が存在する場合は値を指すように設定し、値が存在しない場合はnilを設定します。これを処理するためのカスタム検証関数を設定できるように見えますが、それでも一度に1つのフィールドしか検証されません。 –

+2

私はそれを手動でチェックする方が簡単だと思います: 'ID1 == nil && ID2 == nil {return err}' –

答えて

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{})) 
} 
+0

私が探していたものです! – Ram

-1

&の適合性が直接的でない場合は、独自の検証関数を記述して実行する方がよい場合があります。処理の面では、パッケージを使用すると、何らかのコードがどこかで最終的に同じチェックをやる必要があるので、効率を上げることはありません!

関連する問題