リフレクションを使用した構造体のフィールド名の取得
Golang では、リフレクションを使用して、プログラムの構造と実行時の動作に関する情報にアクセスできます。一般的な使用例の 1 つは、構造体のフィールドの名前を取得することです。
次の例を考えてみましょう:
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()) // Prints "string" }
ここでの目的は、フィールド名として "Foo" を出力することですが、代わりに、「string」を出力します。この動作を理解するために、コードを詳しく見てみましょう。
まず、reflect.Indirect(reflect.ValueOf(a)) は、構造体 a へのポインターを、基になる値を表すreflect.Value に変換します。 val.Field(0) は、構造体の最初のフィールドに対応する Reflect.Value を返します。この場合は Foo です。
ただし、val.Field(0).Type().Name() は次の値を取得します。フィールドのタイプ (文字列)。フィールド自体の名前は、
fmt.Println(val.Type().Field(0).Name) // Prints "Foo"
を使用して取得できます。これは、val.Type() が構造体の型情報にアクセスし、後続の Field(0).Name が名前を取得するためです。
要約すると、リフレクションを使用して構造体フィールドの名前を取得するには、val.Type().Field(0).Name ではなく val.Type().Field(0).Name を使用する必要があります。 val.Field(0).Type().Name.
以上がGo Reflection を使用して構造体のフィールド名を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。