ホームページ >バックエンド開発 >Golang >Go の `reflect.ValueOf()` と `Value.Elem()` の違いは何ですか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 17:04:10896ブラウズ

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

reflect.ValueOf() と Value.Elem() の違いを理解する

Reflect.ValueOf() はリフレクションへのゲートウェイとして機能しますを使用すると、文字列やintegers.

一方、Value.Elem() は、reflect.Value 内のメソッドとして機能します。これを使用して、元のreflect.Valueによってカプセル化された値によって参照される値(reflect.Valueでもあります)を取得できます。この目的には、reflect.Indirect() も利用できることに注意してください。

リフレクションから非リフレクションに戻すには、ラップされた値を単純なインターフェイスとして返す Value.Interface() メソッドを使用します。 }.

var i int = 3
var p *int = &i
fmt.Println(p, i) // Output: 0x414020 3

v := reflect.ValueOf(p)
fmt.Println(v.Interface()) // Output: 0x414020

v2 := v.Elem()
fmt.Println(v2.Interface()) // Output: 3

高度な使用例: Value.Elem()インターフェイス

reflect.Value がインターフェイス値をラップする場合、Value.Elem() はそのインターフェイス内の具体的な値も取得できます。

var r io.Reader = os.Stdin

v := reflect.ValueOf(r)
fmt.Println(v.Type()) // Output: *os.File

v2 := reflect.ValueOf(&r)
fmt.Println(v2.Type()) // Output: *io.Reader
fmt.Println(v2.Elem().Type()) // Output: io.Reader
fmt.Println(v2.Elem().Elem().Type()) // Output: *os.File

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。