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>
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!