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 }
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) }
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) }
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!