Erkunden von Reflection mit SetString für Strukturen
Reflection bietet leistungsstarke Tools für die dynamische Bearbeitung von Go-Strukturen. In diesem Beispiel stoßen wir auf ein häufiges Problem, wenn wir versuchen, den Wert eines Strukturfelds mithilfe von Reflection festzulegen: CanSet() gibt immer false zurück. Dieses Hindernis verhindert Feldänderungen und bringt uns in ein Dilemma.
Identifizierung der Fallstricke
Das bereitgestellte Code-Snippet hebt zwei grundlegende Fehler hervor:
Probleme lösen
Nachdem wir diese Fallstricke behoben haben, können wir unseren Code verfeinern:
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
In der modifizierten SetField()-Funktion:
Code eingeben Aktion
Mit diesen Änderungen aktualisiert der Code nun erfolgreich den Wert von Feld1:
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
fmt.Println("Before: ", source.StructA[0])
SetField(&source.StructA[0], "Field1", "NEW_VALUE")
fmt.Println("After: ", source.StructA[0])
}
Ausgabe:
Before: {A 2} true After: {NEW_VALUE 2}
Das Ergebnis zeigt die erfolgreiche Änderung von Feld1 innerhalb der Eintragsstruktur.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3