Heim >Backend-Entwicklung >Golang >Was ist der Unterschied zwischen „reflect.ValueOf()' und „Value.Elem()' in Go?

Was ist der Unterschied zwischen „reflect.ValueOf()' und „Value.Elem()' in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-12-13 17:04:10896Durchsuche

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

Den Unterschied zwischen Reflect.ValueOf() und Value.Elem() verstehen

Reflect.ValueOf() dient als Tor zur Reflexion , wodurch Sie einen Reflect.Value-Deskriptor für Nicht-Reflexionswerte wie Zeichenfolgen oder Ganzzahlen erhalten können.

Ein Andererseits fungiert Value.Elem() als Methode innerhalb vonflect.Value. Es kann verwendet werden, um den Wert (auch ein „reflect.Value“) abzurufen, auf den der durch den ursprünglichen „reflect.Value“ gekapselte Wert verweist. Beachten Sie, dass „reflect.Indirect()“ auch für diesen Zweck verwendet werden kann.

Um von der Reflexion zurück zur Nichtreflexion zu wechseln, verwenden Sie die Methode Value.Interface(), die den umschlossenen Wert als einfache Schnittstelle zurückgibt{ }.

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

Erweiterter Anwendungsfall: Value.Elem() für Schnittstellen

If reflektieren.Value Umschließt einen Schnittstellenwert. Value.Elem() kann auch den konkreten Wert innerhalb dieser Schnittstelle abrufen.

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

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen „reflect.ValueOf()' und „Value.Elem()' in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn