3

Go HTML テンプレート内から構造体フィールドが存在するかどうかを確認することは可能ですか?

たとえば、次のテンプレートがあるとします。

{{if .FieldA}}
    <a>{{.FieldA}}</a>
{{end}

および次のように定義された構造体:

type MyStruct struct{  
    var FieldA string
    var FieldB string
}
// In this struct FieldA is unavailable
type MyStruct2 struct{  
    var FieldB string
}

テンプレートに渡すMyStructとうまくいきます。MyStruct2ただし、テンプレートに渡すとエラーになります。ステートメントはifnil 値をチェックできますが、現在の構造体に存在しないフィールドに遭遇するとエラー (テンプレート エグゼキューターを強制終了) をスローします。

特定のフィールドが特定の構造体でしか利用できない場合があるため、アクセスを試みる前にそのフィールドが存在するかどうかを確認する方法はありますか?

私は公式のドキュメントに不運があり、おそらくエレガントな解決策はないという結論に達しました。

4

1 に答える 1

14

フィールドの存在をチェックする組み込みの方法はありませんが、チェックを行うテンプレート関数を書くことは可能です:

func hasField(v interface{}, name string) bool {
  rv := reflect.ValueOf(v)
  if rv.Kind() == reflect.Ptr {
    rv = rv.Elem()
  }
  if rv.Kind() != reflect.Struct {
    return false
  }
  return rv.FieldByName(name).IsValid()
}

次のようにテンプレートで関数を使用します。

{{if hasField . "FieldA"}}<a>{{.FieldA}}</a>{{end}}

hasFieldfunc マップでテンプレートを作成します。

 t := template.New("").Funcs(template.FuncMap{"hasField": hasField}).Parse(d)

playground example

于 2016-01-10T07:47:10.713 に答える