Menu
Coddy logo textTech

Anonyme Structs

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 15 von 107.

Eine anonyme Struktur ist eine Struktur ohne einen benannten Typ. Sie definieren ihre Struktur und erstellen eine Instanz in einem Schritt, ohne das Schlüsselwort type zu verwenden.

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

Dies erstellt einen struct-Wert direkt, ohne einen wiederverwendbaren Typ zu deklarieren. Anonyme structs sind nützlich, wenn Sie eine schnelle, einmalige Datenstruktur benötigen, die an keiner anderen Stelle in Ihrem Code verwendet wird.

Ein häufiger Anwendungsfall ist das Gruppieren zusammengehöriger Daten für eine einzelne Funktion oder einen Test.

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

Anonyme Structs sind auch bei tabellengesteuerten Tests beliebt, bei denen jeder Testfall über eindeutige Felder verfügt.

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

Da anonyme Structs keinen Typnamen haben, können Sie keine Methoden für sie definieren oder den Typ an anderer Stelle wiederverwenden. Verwenden Sie diese für die temporäre, lokale Gruppierung von Daten. Für alles, worauf Sie mehrfach verweisen werden, definieren Sie stattdessen einen benannten Struct-Typ.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein schnelles Konfigurationssystem erstellen, das zeigt, wann anonyme Structs glänzen – für die einmalige Gruppierung von Daten, die keinen wiederverwendbaren Typ benötigen.

Sie werden Ihren Code auf zwei Dateien aufteilen:

  • config.go: Erstellen Sie eine Funktion namens GetServerConfig, die einen Servernamen (string), einen Port (int) und einen Debug-Modus (bool) als Parameter entgegennimmt. Diese Funktion sollte einen anonymen Struct zurückgeben, der diese drei Werte als Felder enthält: Name, Port und Debug. Da diese Konfiguration nur an einer Stelle verwendet wird, ist es nicht erforderlich, einen benannten Typ dafür zu definieren.
  • main.go: Lesen Sie die Server-Konfigurationswerte aus der Eingabe ein, rufen Sie Ihre Funktion GetServerConfig auf und zeigen Sie die Konfigurationsdetails an.

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Servername
  • Zeile 2: Portnummer
  • Zeile 3: Debug-Modus (true oder false)

Ausgabeformat:

Server: [Name]
Port: [Port]
Debug: [Debug]

Zum Beispiel, gegeben api-server, 8080 und true, sollte Ihre Ausgabe wie folgt aussehen:

Server: api-server
Port: 8080
Debug: true

Beachten Sie, wie der anonyme Struct es Ihnen ermöglicht, gruppierte Daten zurückzugeben, ohne Ihre Codebasis mit einem Typ zu überladen, der nur einmal verwendet wird.

Spickzettel

Ein anonymer Struct ist ein Struct ohne einen benannten Typ, der in einem Schritt definiert und instanziiert wird, ohne das Schlüsselwort type zu verwenden:

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

Anonyme Structs sind nützlich für einmalige Datenstrukturen, die an keiner anderen Stelle in Ihrem Code wiederverwendet werden.

Häufige Anwendungsfälle sind das Gruppieren zusammengehöriger Daten für eine einzelne Funktion:

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

Und tabellengesteuerte Tests (table-driven tests):

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

Anonyme Structs können keine definierten Methoden haben oder als Typ wiederverwendet werden. Verwenden Sie sie für temporäre, lokalisierte Datengruppierungen. Für Typen, auf die mehrfach verwiesen wird, definieren Sie stattdessen einen benannten Struct.

Funktionen können anonyme Structs zurückgeben:

func GetConfig() struct {
    Name string
    Port int
} {
    return struct {
        Name string
        Port int
    }{
        Name: "server",
        Port: 8080,
    }
}

Probier es selbst

package main

import (
	"fmt"
)

func main() {
	// Eingabewerte lesen
	var name string
	var port int
	var debug bool

	fmt.Scanln(&name)
	fmt.Scanln(&port)
	fmt.Scanln(&debug)

	// TODO: GetServerConfig mit den Eingabewerten aufrufen
	// und das zurückgegebene anonyme Struct speichern

	// TODO: Die Konfiguration im erforderlichen Format ausgeben:
	// Server: [Name]
	// Port: [Port]
	// Debug: [Debug]
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung