Go の `reflect.TypeOf()` と `reflect.ValueOf()` の違いは何ですか?

Linda Hamilton
リリース: 2024-10-31 20:52:02
オリジナル
345 人が閲覧しました

 What's the Difference Between `reflect.TypeOf()` and `reflect.ValueOf()` in Go?

Go のリフレクションの型と値

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 です。

Type と Value の違い

reflect.Type を使用すると、関連付けられた情報をクエリできます。すべての変数は同じ型です。たとえば、型、そのフィールド、およびそのメソッドの名前を取得できます。一方、reflect.Value を使用すると、情報をクエリしたり、任意の型のデータに対して操作を実行したりできます。これには、個々のフィールドの取得と設定、型間の値の変換、メソッドの呼び出しが含まれます。

上記の例では、tag 変数には Person 型の最初のフィールドに関連付けられたメタデータが含まれ、name 変数には*Person 構造体の最初のフィールドの実際の値。

結論

リフレクションにおける型と値の違いを理解することで、より柔軟で強力なコードを開発できます。これらの概念は、汎用アプリケーションの作成、ランタイム イントロスペクションの実行、メタプログラミング フレームワークの作成に不可欠です。

以上がGo の `reflect.TypeOf()` と `reflect.ValueOf()` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート