Wie erhält man Feldadressen in verschachtelten Strukturen mithilfe von Reflection?

Susan Sarandon
Freigeben: 2024-10-30 14:08:03
Original
589 Leute haben es durchsucht

How to Obtain Field Addresses in Nested Structures Using Reflection?

Erhalten von Feldadressen in verschachtelten Strukturen mithilfe von Reflexion

In diesem Szenario möchten Sie verschachtelte Strukturen durchqueren und untersuchen und die Adressen von Nichtstrukturen erhalten -Zeigerfelder darin. Mithilfe von Reflektion verfügen Sie über eine Funktion, die Felder durchläuft, jedoch auf Schwierigkeiten stößt, die Speicheradresse von Nicht-Zeigerfeldern in eingebetteten Unterstrukturen zu ermitteln.

Um dieses Problem zu beheben, ist es wichtig zu beachten, dass valueField.Interface() dies tut liefert nicht das erwartete Ergebnis, da es den tatsächlich im Feld gespeicherten Wert zurückgibt, der bei der Arbeit mit Nicht-Zeiger-Typen nicht gültig ist.

Die Lösung liegt darin, die InspectStructV-Funktion so zu ändern, dass sie stattdessen einen „reflect.Value“ empfängt eine Schnittstelle{}. Dadurch können Sie das Reflexionsobjekt direkt manipulieren und die Adresse des Feldes abrufen. Darüber hinaus zeigt valueField, das zuvor den Schnittstellenwert enthielt, beim rekursiven Aufruf von InspectStructV für Strukturfelder jetzt direkt auf den Reflexionswert für die verschachtelte Struktur, um sicherzustellen, dass die Adresse korrekt abgerufen werden kann.

Hier ist der überarbeitete Code Snippet:

<code class="go">func InspectStructV(val reflect.Value) {
    if val.Kind() == reflect.Interface && !val.IsNil() {
        elm := val.Elem()
        if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
            val = elm
        }
    }
    if val.Kind() == reflect.Ptr {
        val = val.Elem()
    }

    for i := 0; i < val.NumField(); i++ {
        valueField := val.Field(i)
        typeField := val.Type().Field(i)
        address := "not-addressable"

        if valueField.Kind() == reflect.Interface && !valueField.IsNil() {
            elm := valueField.Elem()
            if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
                valueField = elm
            }
        }

        if valueField.Kind() == reflect.Ptr {
            valueField = valueField.Elem()
        }

        if valueField.CanAddr() {
            address = fmt.Sprintf("0x%X", valueField.Addr().Pointer())
        }

        fmt.Printf("Field Name: %s,\t Field Value: %v,\t Address: %v\t, Field type: %v\t, Field kind: %v\n", typeField.Name,
            valueField.Interface(), address, typeField.Type, valueField.Kind())

        if valueField.Kind() == reflect.Struct {
            InspectStructV(valueField)
        }
    }
}

func InspectStruct(v interface{}) {
    InspectStructV(reflect.ValueOf(v))
}</code>
Nach dem Login kopieren

Durch diese Änderungen können Sie die Speicheradressen von Nicht-Zeigerfeldern erfolgreich abrufen, selbst wenn sie sich in verschachtelten Strukturen befinden.

Das obige ist der detaillierte Inhalt vonWie erhält man Feldadressen in verschachtelten Strukturen mithilfe von Reflection?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!