„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie überwinde ich, dass SetCan() beim Festlegen von Strukturfeldwerten mithilfe von Reflection immer „False“ zurückgibt?

Wie überwinde ich, dass SetCan() beim Festlegen von Strukturfeldwerten mithilfe von Reflection immer „False“ zurückgibt?

Veröffentlicht am 09.11.2024
Durchsuche:580

How to Overcome SetCan() Always Returning False When Setting Struct Field Values Using Reflection?

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:

  1. Übergabe eines Werts anstelle eines Zeigers: Strukturen nach Wert können nicht durch Reflektion geändert werden. Stattdessen müssen wir einen Zeiger auf die Struktur übergeben, um sicherzustellen, dass alle Änderungen auf das tatsächliche Objekt angewendet werden.
  2. Falsches Element-Targeting: Der Code arbeitet zunächst auf der gesamten ProductionInfo-Struktur und nicht auf der Spezifischer Eintrag, dessen Feld1-Wert geändert werden muss. Um dies zu beheben, müssen wir uns auf das gewünschte Eintragselement konzentrieren.

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:

  1. Verwenden Sie Elem(), um zum Wert des Objekts zu navigieren, auf das verwiesen wird, und stellen Sie sicher, dass wir mit der tatsächlichen Struktur arbeiten.
  2. Verwenden Sie FieldByName(), um auf das spezifische Feld zuzugreifen, das wir ändern möchten.

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.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729662680 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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