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型に変換しています。