Heim >Backend-Entwicklung >Golang >Wie überwinde ich, dass SetCan() beim Festlegen von Strukturfeldwerten mithilfe von Reflection immer „False' zurückgibt?
Erkunden von Reflection mit SetString für Strukturen
Reflection bietet leistungsstarke Werkzeuge zur dynamischen 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:
<code class="go">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) } }</code>
In der modifizierten SetField()-Funktion:
Code in Aktion
Mit diesen Änderungen ist der Code jetzt Aktualisiert den Feld1-Wert erfolgreich:
<code class="go">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]) }</code>
Ausgabe:
Before: {A 2} true After: {NEW_VALUE 2}
Das Ergebnis zeigt die erfolgreiche Änderung von Feld1 innerhalb der Eintragsstruktur.
Das obige ist der detaillierte Inhalt vonWie überwinde ich, dass SetCan() beim Festlegen von Strukturfeldwerten mithilfe von Reflection immer „False' zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!