2017-02-03 4 views
0

structを受け取り、指定されたフィールドにゼロ以外の値があることを確認する汎用関数を作成しようとしています。Goで構造体フィールドが0以外であることを確認

は、これは私の関数である:

func CheckRequiredFields(kind string, i interface{}, fields ...string) error { 
    for _, field := range fields { 
     value := reflect.ValueOf(i).FieldByName(field) 
     if value.Interface() == reflect.Zero(value.Type()).Interface() { 
      return fmt.Errorf("missing required %s field %s", kind, field) 
     } 
    } 
    return nil 
} 

structiとして渡された場合、それはうまく動作しますが、istructへのポインタである場合には失敗しました。

渡された値がポインタの場合、インターフェイスの値をどのように反映できますか?

答えて

1

reflect.Indirectを使用できます。これは、vが指す値を返します。 vがnilポインタの場合、Indirectはゼロ値を返します。 vがポインタでない場合、Indirectはvを返します。

値がポインタであるかどうかを確認する場合は、Kindをチェックし、Elem()を使用してポインタを逆参照してください。

v := reflect.ValueOf(i) 
if v.Kind() == reflect.Ptr { 
    v = v.Elem() 
} 
+0

ありがとう、私はそれがそういうものだと思った。 – Ralph