構造体の文字列フィールドを反復処理して、クリーンアップ/検証(strings.TrimSpace
、strings.Trim
など)を行うことができます。構造体の文字列フィールドを反復処理する
今私は、本当にスケーラブルではない厄介なスイッチケースを持っています。これは私のアプリケーション(ウェブフォーム)のホットスポットではないので、reflect
が良い選択です。
私はこれを実装する方法のいくつかの障害に遭っています。また、反映されたドキュメントは少し混乱しています(私は他の検証パッケージを掘り下げていますが、私は)すでにアンマーシャル一部にゴリラ/スキーマを使用しています:
- 反復を構造体
- の上に文字列型のフィールドごとに、私は必要なものは何でも適用へ
strings
パッケージからfield = strings.TrimSpace(field)
- 場合、すなわちありフィールドが存在します.Tag.Get( "max")、その値を使用します(strconv.Atoi、unicode.RuneCoun tInString)
は、エラー・インタフェース・タイプ、事前に
type FormError []string type Listing struct { Title string `max:"50"` Location string `max:"100"` Description string `max:"10000"` ExpiryDate time.Time RenderedDesc template.HTML Contact string `max:"255"` } // Iterate over our struct, fix whitespace/formatting where possible // and return errors encountered func (l *Listing) Validate() error { typ := l.Elem().Type() var invalid FormError for i = 0; i < typ.NumField(); i++ { // Iterate over fields // For StructFields of type string, field = strings.TrimSpace(field) // if field.Tag.Get("max") != "" { // check max length/convert to int/utf8.RuneCountInString if max length exceeded, invalid = append(invalid, "errormsg") } if len(invalid) > 0 { return invalid } return nil } func (f FormError) Error() string { var fullError string for _, v := range f { fullError =+ v + "\n" } return "Errors were encountered during form processing: " + fullError }
おかげと互換性のあるエラーのスライスを提供します。
すばらしかったです。私のすべてのフィールドがエクスポートされます(構造体も私のDBスキーマを反映します)が、Validateはリストと同じパッケージに入っています。私がまだ持っている唯一の問題は、 'field.Tag.Get(" max ")'を使用しています - もしそうでなければ、私は 'Tag'メソッドを呼び出すべきですか? http://play.golang.org/p/yMRLFCW4vt – elithrar
私はちょうど編集を行いました。タグは構造体自体のreflect.Typeの一部です。したがって、 'msValue.Type()'からフィールドを再取得し、対応するフィールドからタグを取得する必要があります。 – LinearZoetrope
グレート - これ(http://play.golang.org/p/Uks300ZsS3)はうまくいきました。フィールド 'Tag'にアクセスするためのショートカットを提供するための答えとして、' listType:= reflect.TypeOf(* l) 'を宣言しました。あなたの助けをもう一度ありがとう! – elithrar