Heim > Artikel > Backend-Entwicklung > Wie erhalte ich mithilfe von Reflection in Go einen Zeiger auf einen Wert?
Zeiger auf Wert mithilfe von Reflection abrufen
Die Überprüfung der Felder einer Schnittstelle erfordert die Verwendung von Reflection in Go. Beim Versuch, die Adresse von Nicht-Zeigerfeldern abzurufen, treten jedoch Herausforderungen auf. Dieser Artikel befasst sich mit diesen Herausforderungen und bietet eine Lösung.
Im bereitgestellten Codebeispiel durchläuft eine Funktion namens InspectStruct eine bestimmte Struktur und gibt Details zu jedem Feld aus. Während die meisten Felder berücksichtigt werden, führen Nicht-Zeigerfelder, die auf höheren Ebenen innerhalb der Struktur eingebettet sind, zu „nicht adressierbaren“ Ergebnissen.
Lösung
Das Problem liegt in der Verwendung der Methode „reflect.Value.Interface()“. Um die Adresse eines Nicht-Zeigerfelds zu erhalten, wird empfohlen, „reflect.Value“ anstelle von „interface{}“ an die Funktion „InspectStruct“ zu übergeben. Der korrigierte Code unten enthält diese Änderung:
<code class="go">func InspectStructV(val reflect.Value) { // ... (remaining code is identical) } func InspectStruct(v interface{}) { InspectStructV(reflect.ValueOf(v)) }</code>
Mit dieser Änderung funktioniert die InspectStruct-Funktion wie vorgesehen und liefert die Adressen aller Felder innerhalb der Struktur, unabhängig von ihrer Tiefe oder ihrem Zeigerstatus. Dies ist aus den aktualisierten Testergebnissen ersichtlich:
Field Name: Id, Field Value: 1, Address: 0x408125440 , Field type: int , Field kind: int Field Name: F, Field Value: {2 {3}}, Address: 0x408125444 , Field type: main.V , Field kind: struct Field Name: Id, Field Value: 2, Address: 0x408125450 , Field type: int , Field kind: int Field Name: F, Field Value: {3}, Address: 0x408125458 , Field type: main.Z , Field kind: struct Field Name: Id, Field Value: 3, Address: 0x408125460 , Field type: int , Field kind: int
Das obige ist der detaillierte Inhalt vonWie erhalte ich mithilfe von Reflection in Go einen Zeiger auf einen Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!