リフレクション値オブジェクト (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