リフレクションを使用した構造体フィールド名の決定
Go では、リフレクションを使用して動的に構造体フィールドにアクセスし、操作することができます。ただし、一般的な課題は、特定の構造体フィールドの名前を決定することです。
次の例を考えてみましょう。
type A struct { Foo string } func (a *A) PrintFoo() { fmt.Println("Foo value is " + a.Foo) } func main() { a := &A{Foo: "afoo"} val := reflect.Indirect(reflect.ValueOf(a)) fmt.Println(val.Field(0).Type().Name()) }
このコードでは、構造体 A へのポインターが作成され、値はリフレクションを使用してアクセスされます。ただし、 fmt.Println(val.Field(0).Type().Name()) は、「Foo」ではなく「string」を出力します。
Solution
フィールドの名前を取得するには、Type().Name() の代わりに Field(0).Name を使用する必要があります。次のコードは、これを行う方法を示しています。
fmt.Println(val.Field(0).Name())
reflect.StructField の Name メソッドは、フィールドの実際の名前 (「Foo」) を提供します。
その他の考慮事項
Field(0) が構造体の最初のフィールドを参照していることに注意することが重要です。特定のフィールドの名前を取得する必要がある場合は、そのインデックスを使用できます。
さらに、特定のフィールド値を表すreflect.Valueのフィールド名を取得する方法はありません。この情報はフィールド値自体には保存されず、それを含む構造体に保存されます。
以上がGo Reflection を使用して構造体フィールドの名前を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。