Go のリフレクト パッケージは、実行時にさまざまな型の値を検査および変更する機能を提供します。これにより、開発者は、任意の型のデータを操作できる強力な汎用コードを作成できます。
リフレクションの 1 つの側面は、型と値の違いです。 Reflect.TypeOf() は、変数の型を表す Reflect.Type オブジェクトを返します。 reflect.ValueOf() は、その型の特定の値を表す Reflect.Value オブジェクトを返します。
次のコード スニペットを考えてみましょう。
<code class="go">func show(i interface{}) { switch t := i.(type) { case *Person: t := reflect.TypeOf(i) //what t contains? v := reflect.ValueOf(i) //what v contains? tag := t.Elem().Field(0).Tag name := v.Elem().Field(0).String() } }</code>
Inこの場合、t は i のタイプ、つまり *person を指します。 v には、i の実際の値が含まれます。これは、文字列フィールド「name」を持つ *person です。
reflect.Type を使用すると、関連付けられた情報をクエリできます。すべての変数は同じ型です。たとえば、型、そのフィールド、およびそのメソッドの名前を取得できます。一方、reflect.Value を使用すると、情報をクエリしたり、任意の型のデータに対して操作を実行したりできます。これには、個々のフィールドの取得と設定、型間の値の変換、メソッドの呼び出しが含まれます。
上記の例では、tag 変数には Person 型の最初のフィールドに関連付けられたメタデータが含まれ、name 変数には*Person 構造体の最初のフィールドの実際の値。
リフレクションにおける型と値の違いを理解することで、より柔軟で強力なコードを開発できます。これらの概念は、汎用アプリケーションの作成、ランタイム イントロスペクションの実行、メタプログラミング フレームワークの作成に不可欠です。
以上がGo の `reflect.TypeOf()` と `reflect.ValueOf()` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。