Tracks
/
Go
Go
/
Lehrplan
/
Structs
St

Structs in Go

1 Übung

Über Structs

In Go ist ein struct eine Folge von benannten Elementen, die Felder genannt werden. Jedes Feld hat einen Namen und einen Typ. Der Name eines Feldes muss innerhalb des Structs eindeutig sein. Structs kann man mit Klassen im Paradigma der objektorientierten Programmierung vergleichen.

Ein Struct definieren

Du erstellst ein neues Struct mit den Schlüsselwörtern type und struct und legst den Namen und den Typ der Felder explizit fest. Zum Beispiel definieren wir hier das Struct Shape, das den Namen einer Form und ihre Größe speichert:

type Shape struct {
    name string
    size int
}

Feldnamen in Structs folgen der Go-Konvention: Felder, deren Name mit einem Kleinbuchstaben beginnt, sind nur für Code im selben Paket sichtbar, während Felder, deren Name mit einem Großbuchstaben beginnt, auch in anderen Paketen sichtbar sind.

Instanzen eines Structs erstellen

Sobald du das struct definiert hast, musst du eine neue Instanz erstellen und die Felder dabei über ihren Feldnamen in beliebiger Reihenfolge festlegen:

s := Shape {
    name: "Square",
    size: 25,
}

Um Felder einer Instanz zu lesen oder zu ändern, verwendest du die .-Notation:

// Update the name and the size
s.name = "Circle"
s.size = 35
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 35

Felder, denen kein Anfangswert zugewiesen wird, haben ihren Nullwert. Zum Beispiel:

s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0

Du kannst eine Instanz eines struct erstellen, ohne die Feldnamen zu verwenden, solange du die Felder in der richtigen Reihenfolge definierst:

s := Shape {
	"Oval",
	20,
}

Diese Syntax gilt jedoch als brüchiger Code, weil sie kaputtgehen kann, wenn ein Feld hinzugefügt wird, besonders wenn das neue Feld einen anderen Typ hat. Im folgenden Beispiel fügen wir dem Shape ein zusätzliches Feld hinzu:

type Shape struct {
	name        string
	description string // new field 'description' added
	size        int
}

s := Shape{
    "Circle",
    20,
}
// Since the second field of the struct is now a string and not an int,
// the compiler will throw an error when compiling the program:
// Output: cannot use 20 (type untyped int) as type string in field value
// Output: too few values in Shape{...}

„New“-Funktionen

Manchmal ist es praktisch, Funktionen zu haben, die uns beim Erstellen von Struct-Instanzen helfen. Nach Konvention heißen diese Funktionen meist New oder ihr Name beginnt mit New. Da sie aber ganz normale Funktionen sind, kannst du ihnen einen beliebigen Namen geben. Sie erinnern dich vielleicht an Konstruktoren in anderen Sprachen, aber in Go sind sie einfach normale Funktionen.

Im folgenden Beispiel wird eine dieser New-Funktionen verwendet, um eine neue Instanz von Shape zu erstellen und automatisch einen Standardwert für die size der Form zu setzen:

func NewShape(name string) Shape {
	return Shape{
		name: name,
		size: 100, //default-value for size is 100
	}
}

NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }

Die Verwendung von New-Funktionen kann folgende Vorteile haben:

  • Validierung der übergebenen Werte
  • Behandlung von Standardwerten
  • Da New-Funktionen oft im selben Paket deklariert werden wie die Structs, die sie initialisieren, können sie sogar private Felder des Structs initialisieren

Wenn du tiefer in diesen Typ eintauchen möchtest, kannst du dir diese Ressourcen ansehen: Go by Example: Structs, A Tour of Go: Structs oder Structures in Go (structs)

Das eingebaute new

Eine weitere Möglichkeit, eine neue Instanz eines Structs zu erstellen, ist das eingebaute new:

s := new(Shape) // s will be of type *Shape (pointer to shape)
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name:  size: 0

In diesem Beispiel erstellt new eine Instanz des Structs Shape, bei der alle Werte auf den Nullwert ihres Typs initialisiert sind, und gibt einen Zeiger darauf zurück.

Note

Meistens wirst du keine neuen Struct-Instanzen sehen, die mit dem eingebauten new erstellt wurden. Bevorzuge immer ein Struct-Literal, eine eigene New-Funktion oder eine andere Funktion aus dem Paket, die dir beim Erstellen eines Structs hilft. Verwende das eingebaute new zum Erstellen neuer Struct-Instanzen nur als letzten Ausweg.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Structs