Anonyme Structs
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 15 von 107.
Eine anonyme Struktur ist eine Struktur ohne benannten Typ. Du definierst ihre Struktur und erstellst in einem Schritt eine Instanz, ohne das Schlüsselwort type zu verwenden.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Dies erstellt direkt einen Struct-Wert, ohne einen wiederverwendbaren Typ zu deklarieren. Anonyme Structs sind nützlich, wenn du schnell eine einmalige Datenstruktur benötigst, die an keiner anderen Stelle in deinem Code verwendet wird.
Ein häufiger Anwendungsfall ist das Gruppieren zusammengehöriger Daten für eine einzelne Funktion oder einen einzelnen Test.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostAnonyme Strukturen sind auch bei tabellengesteuerten Tests beliebt, bei denen jeder Testfall eindeutige Felder hat.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Da anonyme Strukturen keinen Typnamen haben, kannst du für sie keine Methoden definieren und den Typ auch nicht an anderer Stelle wiederverwenden. Verwende sie für eine vorübergehende, lokale Gruppierung von Daten. Für alles, worauf du mehrfach verweisen wirst, definiere stattdessen einen benannten Strukturtyp.
Aufgabe
EinfachErstellen wir ein schnelles Konfigurationssystem, das zeigt, wann anonyme Structs besonders nützlich sind: zur einmaligen Gruppierung von Daten, für die kein wiederverwendbarer Typ benötigt wird.
Du organisierst deinen Code über zwei Dateien:
config.go: Erstelle eine Funktion namensGetServerConfig, die einen Servernamen (string), einen Port (int) und den Debug-Modus (bool) als Parameter entgegennimmt. Diese Funktion sollte ein anonymes Struct zurückgeben, das diese drei Werte als Felder enthält:Name,PortundDebug. Da diese Konfiguration nur an einer Stelle verwendet wird, ist es nicht nötig, dafür einen benannten Typ zu definieren.main.go: Lies die Konfigurationswerte des Servers aus der Eingabe ein, rufe deine FunktionGetServerConfigauf und zeige die Konfigurationsdetails an.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Servername
- Zeile 2: Portnummer
- Zeile 3: Debug-Modus (
trueoderfalse)
Ausgabeformat:
Server: [Name]
Port: [Port]
Debug: [Debug]Wenn beispielsweise api-server, 8080 und true angegeben werden, sollte deine Ausgabe folgendermaßen aussehen:
Server: api-server
Port: 8080
Debug: trueBeachte, wie das anonyme Struct es dir ermöglicht, gruppierte Daten zurückzugeben, ohne deine Codebasis mit einem Typ zu überladen, der nur einmal verwendet wird.
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: Rufe GetServerConfig mit den Eingabewerten auf
// und speichere die zurückgegebene anonyme Struktur
// TODO: Gib die Konfiguration im erforderlichen Format aus:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler