Heim  >  Artikel  >  Backend-Entwicklung  >  Ist Reflexion im Golang wichtig?

Ist Reflexion im Golang wichtig?

(*-*)浩
(*-*)浩Original
2019-12-03 13:37:412864Durchsuche

Ist Reflexion im Golang wichtig?

Golang bietet einen Mechanismus zum Aktualisieren von Variablen, zum Anzeigen von Werten zur Laufzeit, zum Aufrufen von Methoden und zum direkten Ändern ihres Layouts, ohne den Typ zur Kompilierungszeit zu kennen heißt Reflexion.

Warum Reflexion nutzen?                                                                                                                        (Empfohlenes Lernen: go)

Zum Beispiel benötigen wir manchmal eine Funktion, die verschiedene Arten von Werten verarbeiten kann. Ohne den Typ zu kennen, könnten Sie schreiben:

// 伪代码
switch value := value.(type) {
case string:
    // ...一些操作
case int:   
    // ...一些操作  
case cbsStruct: // 自定义的结构体  
    // ...一些操作

// ...
}

Haben Sie irgendwelche Probleme festgestellt?

Hier gibt es ein Problem: Es gibt viele Typen, das Schreiben dieser Funktion wird sehr lange dauern, und es kann auch benutzerdefinierte Typen geben, was bedeutet, dass dieses Urteil möglicherweise in Zukunft geändert werden muss , weil es keine Möglichkeit gibt, es zu wissen. Es ist unbekannt, zu welchem ​​Typ der Wert gehört.

Wenn Sie einen unbekannten Typ nicht durchschauen können, ist der obige Code tatsächlich nicht sehr sinnvoll. Zu diesem Zeitpunkt benötigen Sie Reflexion, um damit umzugehen. Verwenden Sie die Funktionen TypeOf und ValueOf, um die Informationen zu erhalten Das Zielobjekt über die Schnittstelle entfernen und den Zweck problemlos erfüllen.

3. Was genau kann Reflexion bewirken?

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var name string = "咖啡色的羊驼"

    // TypeOf会返回目标数据的类型,比如int/float/struct/指针等
    reflectType := reflect.TypeOf(name)

    // valueOf返回目标数据的的值,比如上文的"咖啡色的羊驼"
    reflectValue := reflect.ValueOf(name)

    fmt.Println("type: ", reflectType)
    fmt.Println("value: ", reflectValue)
}

Golang stellt das Reflect-Paket zur Unterstützung der Reflection bereit. Die wichtigsten umfassen zwei Methoden und zwei Strukturen (genauer gesagt eine Struktur und eine Schnittstelle), die zum Abrufen bzw. Betreiben von Dynamic verwendet werden Typen und dynamische Werte von Schnittstellenvariablen.

Zwei Methoden:

func TypeOf(i interface{}) Type {...} Diese Methode empfängt einen leeren Schnittstellentyp Variables und Tatsächliche Parameter werden kopiert und in leere Schnittstellenvariablen umgewandelt, die schließlich als Parameter von TypeOf verwendet werden.

Innerhalb der Funktion werden die dynamischen Typinformationen der Schnittstellenvariablen entnommen und zur Rückgabe in „reflect.Type“ gekapselt. Da „reflect.Type“ eine Schnittstelle ist, wird tatsächlich die Instanz der Schnittstelle verwendet. Die eigentliche Instanz ist hier „reflect .rtype“.

func ValueOf(i interface{}) Value {...} Mit dem TypeOf-Funktionstyp erhält er auch eine Kopie, wandelt sie dann in eine leere Schnittstellenvariable um und übernimmt Geben Sie die Schnittstellenvariable innerhalb der Methode aus. Der dynamische Wert wird dann gekapselt und als Reflect.Value-Objekt zurückgegeben.

Das obige ist der detaillierte Inhalt vonIst Reflexion im Golang wichtig?. 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