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) // localhostAnonyme 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.
Aufgabe
EinfachLassen 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 namensGetServerConfig, 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,PortundDebug. 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 FunktionGetServerConfigauf und zeigen Sie 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]Zum Beispiel, gegeben api-server, 8080 und true, sollte Ihre Ausgabe wie folgt aussehen:
Server: api-server
Port: 8080
Debug: trueBeachten 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) // localhostUnd 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]
}
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 Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool