Zusammenfassung - Kontaktbuch
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 18 von 107.
Aufgabe
EinfachLassen Sie uns ein Kontaktbuchsystem erstellen, das benutzerdefinierte Typen, verschachtelte Structs, Struct-Tags und Nullwerte vereint – all die Konzepte, die Sie in diesem Kapitel gemeistert haben.
Sie werden Ihren Code auf zwei Dateien aufteilen:
contact.go: Definieren Sie Ihr Kontaktbuch-Datenmodell mit aussagekräftigen benutzerdefinierten Typen und korrekter JSON-Formatierung:- Erstellen Sie benutzerdefinierte Typen
PhoneundEmailbasierend aufstring, um Ihren Code selbstdokumentierend zu machen - Definieren Sie ein
Address-Struct mit den FeldernStreet,CityundCountry, jeweils mit entsprechenden JSON-Tags - Definieren Sie ein
Contact-Struct, dasName(string),Phone(Ihr Phone-Typ),Email(Ihr Email-Typ) undAddress(verschachteltes Struct) enthält. Verwenden Sie JSON-Tags, bei denenphoneundemailweggelassen werden sollen, wenn sie leer sind
- Erstellen Sie benutzerdefinierte Typen
main.go: Lesen Sie Kontaktinformationen aus der Eingabe ein, erstellen Sie eine Contact-Instanz und geben Sie diese als formatiertes JSON aus. Einige Kontakte verfügen möglicherweise über unvollständige Informationen – lassen Sie Nullwerte undomitemptydiese elegant handhaben.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Kontaktname
- Zeile 2: Telefonnummer (kann leer sein)
- Zeile 3: E-Mail-Adresse (kann leer sein)
- Zeile 4: Straße
- Zeile 5: Stadt
- Zeile 6: Land
Verwenden Sie json.MarshalIndent mit zwei Leerzeichen für die Einrückung. Geben Sie den resultierenden JSON-String aus.
Wenn Sie beispielsweise einen Kontakt mit dem Namen Alice Smith, ohne Telefonnummer, der E-Mail alice@example.com, der Straße 123 Main St, der Stadt Boston und dem Land USA erhalten, sollte Ihre Ausgabe wie folgt aussehen:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Beachten Sie, dass das Feld phone überhaupt nicht erscheint, da es leer war – das ist Ihr omitempty-Tag in Aktion!
Probier es selbst
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Name lesen
scanner.Scan()
name := scanner.Text()
// Telefonnummer lesen (kann leer sein)
scanner.Scan()
phone := scanner.Text()
// E-Mail lesen (kann leer sein)
scanner.Scan()
email := scanner.Text()
// Straße lesen
scanner.Scan()
street := scanner.Text()
// Stadt lesen
scanner.Scan()
city := scanner.Text()
// Land lesen
scanner.Scan()
country := scanner.Text()
// TODO: Erstelle eine Contact-Instanz unter Verwendung der Eingabewerte
// Verwende deine benutzerdefinierten Typen Phone und Email für die entsprechenden Felder
// Erstelle das verschachtelte Address-Struct mit street, city und country
// TODO: Verwende json.MarshalIndent, um den Kontakt in JSON zu konvertieren
// Verwende "" als Präfix und " " (zwei Leerzeichen) als Einrückung
// TODO: Gib den JSON-String aus
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
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