ホーム プログラミング言語 golang go reflect Go言語のreflect.ValueOf()とreflect.Value(リフレクションを通じて値情報を取得)

Go言語のreflect.ValueOf()とreflect.Value(リフレクションを通じて値情報を取得)

 
 
インターフェース値をreflect.ValueOf関数呼び出しに渡すと、呼び出しはインターフェース値の動的値を表すreflect.Valueを返します。インターフェイス値を間接的に表すreflect.Valueを取得する必要があります。

 

Reflect.Value 型には多くのメソッドがあります。これらのメソッドを呼び出して、reflect.Value 所有者の値によって表される Go 値を観察および操作できます。これらのメソッドの中には、すべてのタイプの値に適用されるものもありますが、1 つまたは少数のタイプの値にのみ適用されるものもあります。

不適切な Reflect.Value 所有者値を指定してメソッドを呼び出すと、実行時にパニックが発生します。これらのメソッドの正しい使用方法を学ぶには、reflect コードベースの各メソッドのドキュメントを読んでください。

Reflect.Value 値の CanSet メソッドは、この Reflect.Value 値によって表される Go 値が変更可能 (割り当て可能) かどうかを返します。 Go 値を変更できる場合は、対応するreflect.Value 値の Set メソッドを呼び出して Go 値を変更できます。注:reflect.ValueOf 関数によって直接返された Reflect.Value は変更できません。

リフレクションでは値の型情報を取得できるだけでなく、変数の値を動的に取得または設定することもできます。 Go 言語で変数の値を取得および設定するには、reflect.Value を使用します。

任意の値を反射値オブジェクトでラップする

Go 言語では、reflect.ValueOf() 関数を使用して、値のリフレクション値オブジェクト (reflect.Value) を取得します。書き込み形式は以下のとおりです。

value := reflect.ValueOf(rawValue)

Reflect.ValueOf は、rawValue の値情報を含む Reflect.Value 型を返します。値のラッピングと値の取得により、reflect.Value と元の値を相互に変換できます。 reflect.Value は、リフレクション呼び出し関数など、一部のリフレクション操作にとって重要な型です。

反映された値オブジェクトからラップされた値を取得します

Go 言語では、reflect.Value を通じて元の値を取得できます。

1) リフレクション値オブジェクトから値を取得するメソッド(reflect.Value)

元の値は、次の表に示すように、次のメソッドを通じてリフレクション値オブジェクトreflect.Valueから取得できます。

反射値から元の値を取得する方法
メソッド名 説明する
Interface() interface {} 値をインターフェース型として返します。これは、型アサーションを通じて指定された型に変換できます。
Int() int64 値を int として返します。この方法ですべての符号付き整数を返すことができます
Uint() uint64 値を uint として返します。この方法ですべての符号なし整数を返すことができます
Float() float64 値を double (float64) として返します。この方法ですべての浮動小数点数 (float32、float64) を返すことができます。
Bool() Bool 値をブール値として返す
Bytes() []bytes 値を bytes[]bytes の配列として返します。
String() String 値を文字列として返す

2) リフレクション値オブジェクト(reflect.Value)から値を取得する例

次のコードでは、reflect.Value を使用して、整数変数の値からリフレクション値オブジェクト (reflect.Value) を取得します。次に、reflect.Value の Interface() メソッドを使用して、interface{} 型の元の値を取得し、int 型に対応する Reflect.Value の Int() メソッドを使用して、整数値を取得します。

package main

import(
    "fmt"
    "reflect"
)

func main() {

    //整数型変数aを宣言して初期値を割り当てる
    var a int = 1024

    //変数aの反射値オブジェクトを取得する
    valueOfA := reflect.ValueOf(a)

    //interface {}型の値を取得し、型アサーションを使用して変換する
    var getA int = valueOfA.Interface().(int)

    //64ビットの値を取得し、int型に型変換する
    var getA2 int = int(valueOfA.Int())

    fmt.Println(getA, getA2)
} 

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

1024 1024

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

  • 11 行目では、型が int の変数を宣言し、初期値を 1024 に設定します。
  • 14行目、変数aのreflection値オブジェクトを取得します。型はreflect.Valueです。このプロセスはreflect.TypeOf()と似ています。
  • 17行目でvalueOfAリフレクション値オブジェクトをinterface{}型として取り出し、型アサーションによりint型に変換してgetAに代入しています。
  • 20行目でvalueOfA反映値オブジェクトをIntメソッドでint64型として取り出し、必須の型変換により元のint型に変換しています。
 

「 Go言語のreflect.ValueOf()とreflect.Value(リフレクションを通じて値情報を取得)」についてわかりやすく解説!絶対に観るべきベスト2動画

Smart Go: Intro to reflection, or data type information at runtime
囲碁クラス: 33 リフレクション