ホーム プログラミング言語 golang go reflect Go 言語はリフレクションを通じて構造体のメンバーの値にアクセスします






Go 言語はリフレクションを通じて構造体のメンバーの値にアクセスします




 
 
リフレクション値オブジェクト (reflect.Value) は、次の表に示すように、構造体にアクセスするためのメソッドを提供します。これにより、構造体の任意の値へのアクセスを完了できます。

 

反映された値オブジェクトのメンバーアクセスメソッド
方法 述べる
Field(i int) Value インデックスに応じて、インデックスに対応する構造体メンバフィールドの反映値オブジェクトを返します。値が構造体でない場合、またはインデックスが範囲外の場合にクラッシュする
NumField() int 構造体のメンバーフィールドの数を返します。値が構造体でない場合、またはインデックスが範囲外の場合にクラッシュする
FieldByName(name string) Value 指定された文字列に従って、文字列に対応する構造体フィールドを返します。見つからない場合はゼロを返します。値が構造体でない場合、またはインデックスが範囲外の場合はクラッシュします。
FieldByIndex(index []int) Value 多層メンバーにアクセスする場合、[]int で提供される各構造体のフィールド インデックスに従ってフィールドの値を返します。見つからない場合はゼロを返します。値が構造体でない場合、またはインデックスが範囲外の場合はクラッシュします。
FieldByNameFunc(match func(string) bool) Value 照合機能に従って必須フィールドを照合します。見つかった場合はゼロを返し、値が構造体でない場合、またはインデックスが範囲外の場合はクラッシュします。

次のコードは、さまざまな型のメンバーを含む構造体を構築します。 Reflect.Valueが提供するメンバアクセス関数により、構造体値の各種データを取得することができます。

構造体のメンバー値への反射アクセス:

package main

import (
    "fmt"
    "reflect"
)

//構造体を定義する
type dummy struct {
    a int
    b string

    //フィールドの埋め込み
    float32
    bool

    next *dummy
}


func main() {

    //値を構造体にラップする
    d:= reflect.ValueOf(dummy{
            next: &dummy{},
    })

    //フィールドの数を取得
    fmt.Println("NumField", d.NumField())

    //2番目のフィールド(float32フィールド)を取得します。
    floatField:= d.Field(2)

    //フィールドの型を出力する
    fmt.Println("Field", floatField.Type())

    //名前でフィールドを検索する
    fmt.Println("FieldByName(\"b\").Type", d.FieldByName("b").Type())

    //インデックスで検索して、値で、次のフィールドのintフィールドの値を取得します。
    fmt.Println("FieldByIndex([] int {4, 0})。Type()", d.FieldByIndex([] int {4, 0})。Type())
} 

コードの説明は次のとおりです。

  • 9行目は構造体を定義しており、構造体の各フィールドの型が異なります。
  • 24 行目で、構造体がインスタンス化され、reflect.Value 型としてパッケージ化され、メンバーには *dummy のインスタンスが含まれています。
  • 29行目、構造体のフィールド数を取得します。
  • 32 行目と 35 行目では、インデックス 2 のフィールド値 (float32 フィールド) を取得し、型を出力します。
  • 行 38 では、 b文字列に従って、b フィールドのタイプを見つけます。
  • 41行目の[]int{4,0}の4は、ダミー構造体のインデックス値が4のメンバが次であることを意味します。 next の型はダミーであり、構造体でもあるため、[]int{4,0} に 0 を使用して次の値に基づいてインデックス付けを続行します。構造体はダミーのインデックス値 0 を持つフィールドであり、その型は int です。

コード出力は次のとおりです。

NumField 5
Field float32
FieldByName(“b”).Type string
FieldByIndex([]int{4, 0}).Type() int

 

「 Go 言語はリフレクションを通じて構造体のメンバーの値にアクセスします」についてわかりやすく解説!絶対に観るべきベスト2動画

【Go言語 超入門コース】13.構造体|構造体ってなんだ? 異なるデータ型の変数を1つにまとめたもの【プログラミング初心者向け入門講座】
【セイト先生】Go言語使う企業が増えてるって本当!?Go言語を使う企業の特徴は??#エンジニア #プログラミング #Go