Podsumowanie – książka kontaktów
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 18 z 107.
Wyzwanie
ŁatwyStwórzmy system książki kontaktów, który łączy typy niestandardowe, zagnieżdżone struktury, tagi struktur i wartości zerowe — wszystkie zagadnienia opanowane w tym rozdziale.
Rozmieścisz kod w dwóch plikach:
contact.go: Zdefiniuj model danych książki kontaktów, używając znaczących typów niestandardowych i prawidłowego formatowania JSON:- Utwórz typy niestandardowe
PhoneiEmailoparte na typiestring, aby kod sam dokumentował swoje przeznaczenie - Zdefiniuj strukturę
Addressz polamiStreet,CityiCountry, każde z odpowiednim tagiem JSON - Zdefiniuj strukturę
ContactzawierającąName(string),Phone(twój typ Phone),Email(twój typ Email) iAddress(zagnieżdżona struktura). Użyj tagów JSON, aby polaphoneiemailbyły pomijane, gdy są puste
- Utwórz typy niestandardowe
main.go: Odczytaj dane kontaktowe z wejścia, utwórz instancję Contact i wypisz ją jako sformatowany JSON. Niektóre kontakty mogą zawierać niepełne informacje: pozwól, aby wartości zerowe iomitemptyobsłużyły takie przypadki.
Podane zostaną następujące dane wejściowe:
- Wiersz 1: Imię i nazwisko kontaktu
- Wiersz 2: Numer telefonu (może być pusty)
- Wiersz 3: Adres e-mail (może być pusty)
- Wiersz 4: Adres ulicy
- Wiersz 5: Miasto
- Wiersz 6: Kraj
Użyj json.MarshalIndent z dwoma spacjami wcięcia. Wypisz otrzymany ciąg JSON.
Na przykład, jeśli podano kontakt o imieniu i nazwisku Alice Smith, bez numeru telefonu, z adresem e-mail alice@example.com, adresem ulicy 123 Main St, miastem Boston i krajem USA, wynik powinien wyglądać tak:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Zauważ, że pole phone w ogóle się nie pojawia, ponieważ było puste: właśnie tak działa tag omitempty!
Spróbuj swoich sił
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Odczytaj imię
scanner.Scan()
name := scanner.Text()
// Odczytaj numer telefonu (może być pusty)
scanner.Scan()
phone := scanner.Text()
// Odczytaj adres e-mail (może być pusty)
scanner.Scan()
email := scanner.Text()
// Odczytaj ulicę
scanner.Scan()
street := scanner.Text()
// Odczytaj miasto
scanner.Scan()
city := scanner.Text()
// Odczytaj kraj
scanner.Scan()
country := scanner.Text()
// TODO: Utwórz instancję Contact, używając wartości wejściowych
// Użyj własnych typów Phone i Email dla odpowiednich pól
// Utwórz zagnieżdżoną strukturę Address z polami street, city i country
// TODO: Użyj json.MarshalIndent, aby przekształcić kontakt w JSON
// Użyj "" jako prefiksu i " " (dwóch spacji) jako wcięcia
// TODO: Wypisz ciąg JSON
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online