In Go sind Strukturen ein fundamentales Werkzeug zur Erstellung benutzerdefinierter Datentypen. Sie sind ein wesentlicher Bestandteil der Sprache und ermöglichen es, Daten auf strukturierte Weise zu organisieren.
In diesem Beitrag werden wir die Grundlagen von Strukturen in Go erkunden und anhand von Beispielen veranschaulichen, wie sie in Ihren Programmen verwendet werden können.
Legen wir los!
Einführung in Strukturen
Eine Struktur ist eine Zusammenfassung von Datenfeldern unterschiedlicher Datentypen. Sie dienen dazu, Daten logisch zu gruppieren und eigene, komplexe Datensätze zu erstellen. Strukturen können sowohl primitive als auch benutzerdefinierte Datentypen enthalten, wobei die Struktur selbst wiederum ein benutzerdefinierter Typ ist.
In Golang sind Strukturen veränderlich, d.h., ihre Werte können im Laufe der Programmausführung angepasst werden.
Der Einsatz von Strukturen steigert die Codequalität, indem er uns die Möglichkeit gibt, komplexe Datenstrukturen zu modellieren und diese einfach zwischen verschiedenen Modulen zu übergeben. Stellen Sie sich vor, Sie müssten einer Funktion zehn Parameter übergeben – dies würde schnell unübersichtlich. Strukturen lösen dieses Problem, indem sie ermöglichen, statt vieler Parameter eine einzige Struktur zu übergeben.
Eine Struktur wird mit den Schlüsselwörtern type und struct deklariert und durch geschweifte Klammern begrenzt, ähnlich wie Klassen in Java. Innerhalb der Klammern werden die einzelnen Felder mit ihrem jeweiligen Datentyp und einem Bezeichner (Namen) definiert. Die genaue Implementierung wird im nächsten Abschnitt detaillierter betrachtet.
Wenn Sie aus der objektorientierten Programmierung (OOP) kommen, können Sie sich Strukturen als Klassen ohne Vererbung vorstellen.
Deklaration von Strukturen
Nachdem wir nun die Bedeutung und Anwendung von Strukturen verstanden haben, ist es an der Zeit, zu lernen, wie man sie deklariert. Das Grundgerüst einer Struktur sieht wie folgt aus:
type NameDerStruktur struct { Feld1 DatentypFeld1 Feld2 DatentypFeld2 }
Hier sind type
und struct
Schlüsselwörter, und die Struktur enthält mehrere Felder, die jeweils ihren eigenen Datentyp haben.
Betrachten wir ein konkretes Beispiel:
package main import ( "fmt" ) type Benutzer struct { name string alter int kontostand float32 } func main() { var benutzer Benutzer fmt.Println(benutzer) }
In diesem Beispiel definieren wir eine Struktur namens Benutzer
, die aus den Feldern name
(string), alter
(int) und kontostand
(float32) besteht. In der main()
-Funktion deklarieren wir eine Variable vom Typ Benutzer
namens benutzer
und geben diese aus. Da wir die Struktur noch nicht initialisiert haben, wird ihr Nullwert ausgegeben. Der Nullwert entspricht den jeweiligen Nullwerten der Felder.
{ 0 0}
Initialisierung von Strukturen
Im vorangegangenen Abschnitt haben wir gelernt, wie man Strukturen deklariert. Nun wollen wir ihnen Werte zuweisen. Das folgende Codebeispiel zeigt, wie dies funktioniert:
package main import ( "fmt" ) type Benutzer struct { name string alter int kontostand float32 } func main() { // Mit Feldnamen benutzer1 := Benutzer{ name: "Mohit", alter: 24, kontostand: 100.0, } // Ohne Feldnamen benutzer2 := Benutzer{"Nidhi", 21, 1000.0} fmt.Println(benutzer1) fmt.Println(benutzer2) }
Der Code demonstriert die Initialisierung von zwei Strukturen – einmal mit und einmal ohne explizite Feldnamen. Die Ausgabe lautet:
{Mohit 24 100} {Nidhi 21 1000}
Wenn ein Feld nicht explizit initialisiert wird, nimmt es den Standard-Nullwert seines Datentyps an.
benutzer1 := Benutzer{ name: "Mohit", alter: 24, } // Ausgabe - { Mohit 24 0.0 }
Es gibt eine weitere Möglichkeit, Strukturen mit dem Schlüsselwort new
zu erstellen. Wir werden dies im nächsten Abschnitt genauer betrachten.
Zugriff auf Felder einer Struktur
Nun da wir wissen, wie man Strukturen erstellt und initialisiert, wollen wir sehen, wie man auf die Felder einer Struktur zugreift. In Golang verwenden wir hierfür den Punktoperator. Wir setzen das vorherige Beispiel fort, indem wir auf die Felder name
und alter
zugreifen und diese ausgeben.
package main import ( "fmt" ) type Benutzer struct { name string alter int kontostand float32 } func main() { // Mit Feldnamen benutzer := Benutzer{ name: "Mohit", alter: 24, kontostand: 100.0, } fmt.Println(benutzer.name) fmt.Println(benutzer.alter) fmt.Println(benutzer.kontostand) }
Hier verwenden wir struktur_name.feld_name
, um auf die Felder zuzugreifen. Die Ausgabe des obigen Codes lautet:
Mohit 24 100
Wie bereits erwähnt, können wir Strukturen auch mit dem new
-Schlüsselwort erstellen. Hier ist ein Beispiel dafür:
benutzer := new(Benutzer) benutzer.name = "Mohit" benutzer.alter = 24 benutzer.kontostand = 100.0 fmt.Println(benutzer) // Ausgabe - &{Mohit 24 100}
Das new
-Schlüsselwort gibt einen Zeiger auf die neu erstellte Struktur zurück. In Golang ist es nicht notwendig, den Zeiger explizit zu dereferenzieren. fmt.Println(*benutzer)
würde zum gleichen Ergebnis führen.
Verschachtelte Strukturen
Strukturen in Golang können auch andere benutzerdefinierte Typen enthalten, einschließlich anderer verschachtelter Strukturen.
package main import ( "fmt" ) type Benutzer struct { name string alter int kontostand float32 rollendetails Rollendetails } type Rollendetails struct { position string team string } func main() { rollendetailsFürMohit := Rollendetails{ position: "Software Engineer", team: "Transport", } benutzer := Benutzer{ name: "Mohit", alter: 24, kontostand: 100.0, rollendetails: rollendetailsFürMohit, } fmt.Println(benutzer) }
Im obigen Code ist die Rollendetails
-Struktur in der Benutzer
-Struktur eingebettet. Die Ausgabe lautet:
{Mohit 24 100 {Software Engineer Transport}}
Auf die Felder der verschachtelten Struktur kann man ebenfalls mit dem Punktoperator zugreifen:
benutzer.rollendetails.position
Strukturgleichheit
Zwei Strukturen sind dann gleich, wenn jedes ihrer Felder (sowohl primitive als auch benutzerdefinierte Typen) gleich sind. Allerdings sind nicht alle Datentypen direkt vergleichbar (z.B. Maps). Betrachten wir ein Beispiel zur Demonstration der Gleichheit von Strukturen:
package main import ( "fmt" ) type Benutzer struct { name string alter int kontostand float32 } func main() { benutzer1 := Benutzer{ name: "Mohit", alter: 24, kontostand: 100.0, } benutzer2 := Benutzer{ name: "Mohit", alter: 24, kontostand: 100.0, } benutzer3 := Benutzer{ name: "Nidhi", alter: 21, kontostand: 1000.0, } if benutzer1 == benutzer2 { fmt.Println("benutzer1 und benutzer2 sind gleich") } else { fmt.Println("benutzer1 und benutzer2 sind nicht gleich") } if benutzer1 == benutzer3 { fmt.Println("benutzer1 und benutzer3 sind gleich") } else { fmt.Println("benutzer1 und benutzer3 sind nicht gleich") } }
Leere und Nullwertstrukturen sind ebenfalls gleich. Die Reihenfolge der Felder ist irrelevant, es müssen lediglich die Werte aller Felder übereinstimmen. Die Ausgabe des obigen Codes lautet:
benutzer1 und benutzer2 sind gleich benutzer1 und benutzer3 sind nicht gleich
Fazit
Ausgezeichnet!
Sie können nun Strukturen in Golang verwenden. Wir haben die Grundlagen der Deklaration, Initialisierung und des Zugriffs auf Felder behandelt. Wir haben uns auch die Gleichheit von Strukturen und die Verwendung verschachtelter Strukturen angeschaut. Hier sind einige Ressourcen, um mehr über Strukturen zu lernen:
Es gibt noch viel mehr über Strukturen zu lernen, aber dies ist ein guter Ausgangspunkt. Ich hoffe, Sie haben etwas Neues gelernt!
Entdecken Sie weiter. Lernen Sie weiter!