Heim  >  Artikel  >  Backend-Entwicklung  >  Wie iteriere ich mithilfe von Reflektion in Go über Zeichenfolgenfelder in einer Struktur?

Wie iteriere ich mithilfe von Reflektion in Go über Zeichenfolgenfelder in einer Struktur?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-01 07:21:02475Durchsuche

How to iterate over string fields in a struct using reflection in Go?

Iterieren über String-Felder in einer Struktur

Problem:

Iterieren über die String-Felder einer Struktur stellt eine Herausforderung dar, insbesondere wenn Bereinigungs- oder Validierungsvorgänge durchgeführt werden sollen. Die Implementierung mit einem Switch-Case-Ansatz mangelt an Skalierbarkeit und ist ungeeignet, wenn Gorilla/Schema zum Unmarshalling genutzt wird.

Lösung:

Reflect bietet eine Möglichkeit zum Iterieren über Strukturen Felder und die nahtlose Bearbeitung von Zeichenfolgenfeldern. So kann dies erreicht werden:

  1. Erhalten Sie einen Zeiger auf die Struktur:
    Um Werte zu ändern, ist ein Zeiger auf die Struktur erforderlich.
  2. Über Felder iterieren:
    Verwenden Sie NumFields(), um die Anzahl der Felder zu bestimmen, und Field(), um über jedes Feld in der Struktur zu iterieren.
  3. Überprüfen Sie den Feldtyp:
    Überprüfen Sie den Typ jedes Felds mit Type(). Nur String-Felder müssen geändert werden.
  4. String bereinigen:
    Rufen Sie den Feldwert mit Interface() ab und wenden Sie die gewünschten Bereinigungsvorgänge aus dem Strings-Paket an (z. B. TrimSpace).
  5. Wert aktualisieren:
    Verwenden Sie SetString(), um den Wert des Zeichenfolgenfelds zu aktualisieren.

Beispiel:

<code class="go">package main

import (
    "fmt"
    "reflect"
    "strings"
)

type MyStruct struct {
    A, B, C string
    I int
    D string
    J int
}

func main() {
    ms := MyStruct{"Green ", "Eggs", " and ", 2, "Ham      ", 15}
    fmt.Printf("%s%s%s%d%s%d\n", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)

    msValuePtr := reflect.ValueOf(&ms)
    msValue := msValuePtr.Elem()

    for i := 0; i < msValue.NumField(); i++ {
        field := msValue.Field(i)
        if field.Type() != reflect.TypeOf("") {
            continue
        }
        str := field.Interface().(string)
        str = strings.TrimSpace(str)
        field.SetString(str)
    }
    fmt.Printf("%s%s%s%d%s%d\n", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)
}</code>

Vorbehalte:

  • Dieser Ansatz erfordert einen Zeiger auf die Struktur.
  • Reflect kann in Panik geraten, wenn versucht wird, nicht exportierte Felder zu ändern. Behandeln Sie dies, indem Sie den Code im Paket implementieren.

Das obige ist der detaillierte Inhalt vonWie iteriere ich mithilfe von Reflektion in Go über Zeichenfolgenfelder in einer Struktur?. 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