
Verschachtelte Strukturen und Referenzübergabe in der Reflexion
In Go geht es darum, verschachtelte Strukturen zu verstehen und zu erfahren, wie man sie in der Reflexion als Referenz übergeben kann entscheidend. Stellen Sie sich ein Szenario vor, in dem Sie über die verschachtelten Strukturen „Client“ und „Kontakt“ verfügen:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <code class = "go" >type Client struct {
Id int
Age int
PrimaryContact Contact
Name string
}
type Contact struct {
Id int
ClientId int
IsPrimary bool
Email string
}</code>
|
Nach dem Login kopieren
Wenn Sie das Feld „PrimaryContact“ der Struktur „Client“ überprüfen, kann es zu einer „Reflect.Value.Set using unadressable value“-Panik kommen. Dies liegt daran, dass PrimaryContact als Wert und nicht als Referenz übergeben wird. Um dieses Problem zu lösen, müssen wir PrimaryContact als Referenz mithilfe von Reflektion übergeben.
Lösung mit Value.Addr()
-
Übergeben Sie den Zeiger an die Client-Struktur: Um Feldwerte einer Struktur mithilfe von Reflektion festzulegen, müssen Sie sie als Zeiger übergeben. In diesem Fall ist &client der Zeiger auf die Client-Struktur.
-
Zeigerwert des PrimaryContact-Felds abrufen: Verwenden Sie Value.Addr(), um den Zeigerwert des PrimaryContact-Felds abzurufen. Dieser adressierbare Wert kann zum Festlegen der Feldwerte der verschachtelten Struktur verwendet werden.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <code class = "go" >package main
import (
"fmt"
"reflect"
)
type Client struct {
Id int
Age int
PrimaryContact Contact
Name string
}
type Contact struct {
Id int
ClientId int
IsPrimary bool
Email string
}
func main() {
client := Client{}
v := reflect.ValueOf(&client)
primaryContact := v.FieldByName( "PrimaryContact" ).Addr()
primaryContact.FieldByName( "Id" ).SetInt(123)
primaryContact.FieldByName( "ClientId" ).SetInt(456)
primaryContact.FieldByName( "IsPrimary" ).SetBool(true)
primaryContact.FieldByName( "Email" ).SetString( "example@example.com" )
fmt.Printf( "%+v\n" , client)
}</code>
|
Nach dem Login kopieren
Ausgabe:
1 | {Id:0 Age:0 PrimaryContact:{Id:123 ClientId:456 IsPrimary:true Email:example@example.com} Name:}
|
Nach dem Login kopieren
Wichtige Punkte:
- Um eine verschachtelte Struktur als Referenz zu übergeben, verwenden Sie „reflect.Value.Addr()“.
- Legen Sie Feldwerte mit „reflect.Value.SetInt()“, „reflect.Value.SetString()“ usw. fest.
- Iterieren Sie über die Strukturfelder, um Werte für alle verschachtelten Strukturen festzulegen.
Das obige ist der detaillierte Inhalt vonWie übergebe ich verschachtelte Strukturen als Referenz in Reflection mithilfe von Value.Addr()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!