Heim > Backend-Entwicklung > Golang > Wie kann ich in Go über unbekannte Datenstrukturen iterieren?

Wie kann ich in Go über unbekannte Datenstrukturen iterieren?

Susan Sarandon
Freigeben: 2024-12-17 15:46:10
Original
487 Leute haben es durchsucht

How Can I Iterate Over Unknown Data Structures in Go?

Iterieren über Datenstrukturen in Go, ohne genaue Typen zu kennen

Problem:

Wie können wir über eine Datenstruktur iterieren? (Array oder Karte) in Go ohne genaue Kenntnis seines Typs?

Fehlgeschlagen Versuch:

Der folgende Code versucht, über eine Schnittstelle zu iterieren, die entweder eine Karte oder ein Array darstellt, und für jedes Element eine Funktion auszuführen, schlägt jedoch aufgrund von Problemen mit der Typprüfung fehl.

func DoTheThingToAllTheThings(data_interface interface{}) int {
    var numThings int

    switch data := data_interface.(type) {
    case map[interface{}]interface{}:
        numThings = len(data)
        // ...
    case []interface{}:
        numThings = len(data)
        // ...
    default:
        fmt.Println("uh oh!")
    }

    return numThings
}
Nach dem Login kopieren

Lösung:

Die Funktion fmt.Printf("%vn", data_interface) bietet eine Möglichkeit, ohne Typumwandlung über die Datenstruktur zu iterieren.

func PrintData(data_interface interface{}) {
    fmt.Printf("%v\n", data_interface)
}
Nach dem Login kopieren

Dies funktioniert, weil das %v-Verb in fmt.Printf Reflektion verwendet, um den Typ des Arguments zu bestimmen und es entsprechend auszugeben.

Reflection in Go:

Die fmt.Printf-Funktion verwendet intern das Reflect-Paket, um den Typ des zu überprüfen Argument und entscheiden Sie, wie es formatiert werden soll. Reflect.ValueOf(arg) gibt ein Reflect.Value-Objekt zurück, das den tatsächlichen Wert des Arguments darstellt, und Reflect.TypeOf(arg) gibt den Typ des Werts zurück.

Beispiel:

Der folgende Code spiegelt eine Board-Struktur wider und stellt sie dann in eine neue Variable derselben wieder her Typ.

type Board struct {
    Tboard  [9]string
    Player1 Player
    Player2 Player
}

func main() {
    myBoard := makeBoard()

    v := reflect.ValueOf(*myBoard)
    t := v.Type()

    var b2 Board

    b2 = v.Interface().(Board)
    fmt.Printf("v converted back to: %#v\n", b2)
}
Nach dem Login kopieren

Hinweis:

Um Reflektion zu verwenden, muss der Typ der Datenstruktur exportiert werden, was bedeutet, dass er mit einem Großbuchstaben beginnen muss.

Das obige ist der detaillierte Inhalt vonWie kann ich in Go über unbekannte Datenstrukturen iterieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage