Datenstrukturen in Go
Ein Struct ist eine Datenstruktur, die es uns erlaubt Werte verschiedener Datentypen zu Feldern zusammenzufassen. Jedes Feld hat eine Bezeichnung und einen Typ.
Im Prinzip erstellt man sich mit einem Struct einen eigenen Typ.
|
|
Wie man sieht kann man sowohl die kompletten Daten ausgeben, als auch die verschiedenen Felder ganz konkret abrufen.
Eingebettete Structs
Man kann Structs auch ineinander einbetten, d.h. genauso wie ein Struct ein Feld des Typs Integer enthalten kann, könnte es auch ein Feld enthalten, dass in einem anderen Struct definiert wurde.
|
|
Wie man sieht enthält das Struct superHel ein Feld vom Typ person, dass wir zuvor schon definiert haben und ein zusätzliches Feld vom Typ boolean.
Namenskollisionen
Es kann Vorkommen, dass eingebettete Structs eventuell kollidierende Felder haben. In diesem Beispiel wäre das das Feld vorname
|
|
Ruft man den Wert für person2.vorname ab so erhält man das Feld Vorname des Typs superHel. Um an den Vornamen des Typs person zu kommen muss man in diesem Fall ganz konkret das Feld des eingebetteten Structs abrufen: person2.person.vorname
Wenn, wie beim Beispiel zuvor ein Feld des eingebetteten Structs nicht im übergeordneten Struct vorkommt, wird dieses automatisch eine Ebene höher “befördert” und ist wie in dem Beispiel über person2.vorname abrufbar.
Anonyme Structs
Anonyme Structs sind Datenstrukturen ohne Namen. Die Verwendung anonymen Structs macht z.B. Sinn wenn man ein Struct wirklich nur an einer bestimmten Stelle benötigt und es ansonsten nicht nutzbar sein muss:
|
|
Im Grunde passieren hier mehrere Dinge auf einmal. Es wird eine Variable person1 mit einem eigenen Typ definiert (struct {…}). Anschließend werden dieser Variable Werte zugewiesen. Hier sieht man auch warum man anonymen Structs spricht.
In zeile 1 wird zwar über struct {} ein eigener Typ definiert, dieser hat aber keinen Namen im Gegensatz zu den Beispielen zuvor.
Über ein Struct iterieren
Im Gegensatz zu Maps kann man über die Felder eines Structs nicht iterieren. Abhilfe schafft hier das Paket reflect:
|
|
Die Funktion TypeOf() in Zeile 31 liefert uns den Typ vom Typ Type (ja jetzt wirds abstrakt) unseres Structs zurück. Der Typ Type stellt uns neben anderen Methoden die Methode Field() zur Verfügung. Wir übergeben hier eine 1 für den Index 1, also das Feld Vorname. Zurück erhalten wir einen Wert vom Typ StructFiel. Dieser ist selbst ein Struct und besitzt unter anderem die Felder Name, Type, Index und Tag welche wir in Zeile 34+ für die Ausgabe nutzen.
Damit wir über die Felder unseres Staructs iterieren können benötigen wir die Anzahl der Felder. Die Funktion len() scheidet hier leider aus, da sie keine Structs verarbeiten kann. Glücklicherweise besitzt der Typ Type eine Methode NumField() deren Aufgabe es ist die Anzahl der Felder eines Structs zurückzuliefern. Dadurch wird es möglich, so wie in Zeile 41+ über die Felder unseres Structs zu iterieren.