Heim >Backend-Entwicklung >Golang >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?

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 04:19:30566Durchsuche

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 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:

  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 eigentliche 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:

<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:

  1. Verwenden Sie Elem(), um zum Wert des gezeigten Objekts zu navigieren 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 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn