web-dev-qa-db-ja.com

Golang Reflection:構造体フィールドからタグを取得

構造体のフィールドに反映し、そのタグ値への参照を取得することは可能ですか?

例えば:

type User struct {
    name    string `json:name-field`
    age     int
}
...
user := &User{"John Doe The Fourth", 20}
getStructTag(user.name)
...
func getStructTag(i interface{}) string{
   //get tag from field

}

私が見ることができることから、これを行う通常の方法は、typ.NumField()の範囲を超えてから、field.Tag.Get( "tagname")を呼び出すことです。ただし、私のユースケースでは、構造体全体を渡さなくて済む方がはるかに良いでしょう。アイデアはありますか?

21
Jameo

構造体全体を渡す必要はありませんが、フィールドの1つの値を渡すだけでは不十分です。あなたの例ではuser.namestringにすぎません-Reflectパッケージはそれを元の構造体に関連付ける方法を持ちません。

代わりに、指定されたフィールドのreflect.StructFieldを渡す必要があります。

field, ok := reflect.TypeOf(user).Elem().FieldByName("name")
…
tag = string(field.Tag)

http://play.golang.org/p/G6wxUVVbOw を参照してください

(注:Elemは構造体へのポインターであるため、上記のuserを使用します)。

42
djd