Rückblick – Kontaktbuch
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 18 von 107.
Aufgabe
EinfachErstellen wir ein Kontaktbuchsystem, das benutzerdefinierte Typen, verschachtelte Structs, Struct-Tags und Nullwerte zusammenführt: alle Konzepte, die du in diesem Kapitel gemeistert hast.
Du wirst deinen Code auf zwei Dateien verteilen:
contact.go: Definiere dein Datenmodell für das Kontaktbuch mit aussagekräftigen benutzerdefinierten Typen und geeigneter JSON-Formatierung:- Erstelle die benutzerdefinierten Typen
PhoneundEmailauf Grundlage vonstring, damit dein Code sich selbst dokumentiert - Definiere ein
Address-Struct mit den FeldernStreet,CityundCountry, jeweils mit geeigneten JSON-Tags - Definiere ein
Contact-Struct mitName(string),Phone(dein Phone-Typ),Email(dein Email-Typ) undAddress(verschachteltes Struct). Verwende JSON-Tags, sodassphoneundemailweggelassen werden, wenn sie leer sind
- Erstelle die benutzerdefinierten Typen
main.go: Lies Kontaktinformationen aus der Eingabe, erstelle eine Contact-Instanz und gib sie als formatiertes JSON aus. Einige Kontakte können unvollständige Informationen enthalten: Lass Nullwerte undomitemptydiese Fälle problemlos behandeln.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Name des Kontakts
- Zeile 2: Telefonnummer (kann leer sein)
- Zeile 3: E-Mail-Adresse (kann leer sein)
- Zeile 4: Straßenadresse
- Zeile 5: Stadt
- Zeile 6: Land
Verwende json.MarshalIndent mit zwei Leerzeichen für die Einrückung. Gib den resultierenden JSON-String aus.
Wenn beispielsweise ein Kontakt mit dem Namen Alice Smith, ohne Telefonnummer, der E-Mail-Adresse alice@example.com, der Straße 123 Main St, der Stadt Boston und dem Land USA angegeben wird, sollte deine Ausgabe folgendermaßen aussehen:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Beachte, dass das Feld phone überhaupt nicht erscheint, da es leer war: Das ist dein 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()
// Telefon 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 mit den Eingabewerten
// Verwende deine benutzerdefinierten Typen Phone und Email für die entsprechenden Felder
// Erstelle die verschachtelte Address-Struktur mit street, city und country
// TODO: Verwende json.MarshalIndent, um den Kontakt in JSON umzuwandeln
// 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 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