Interfejs fmt.Stringer
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 75 z 107.
Interfejs fmt.Stringer określa, jak Twoje typy są wyświetlane podczas drukowania. To jeden z najczęściej implementowanych interfejsów w Go, zdefiniowany w pakiecie fmt:
type Stringer interface {
String() string
}Gdy przekazujesz wartość do fmt.Println, fmt.Printf z %v lub podobnych funkcji, Go sprawdza, czy typ implementuje Stringer. Jeśli tak, Go wywołuje metodę String(), aby uzyskać tekstową reprezentację.
type Temperature struct {
Celsius float64
}
func (t Temperature) String() string {
return fmt.Sprintf("%.1f°C", t.Celsius)
}
func main() {
temp := Temperature{Celsius: 23.5}
fmt.Println(temp) // 23.5°C
}Bez metody String() wyświetlanie pokazałoby domyślny format struktury: {23.5}. Implementując Stringer, dokładnie kontrolujesz sposób, w jaki prezentuje się Twój typ.
Jest to szczególnie przydatne w przypadku typów, których surowe wartości pól nie przekazują jasno znaczenia. Typ Duration może wyświetlać się jako „2h 30m” zamiast pokazywać surową liczbę nanosekund, a typ User może wyświetlać sformatowane imię i nazwisko zamiast wszystkich swoich pól.
Wyzwanie
ŁatwyZbudujmy system śledzenia czasu, który wyświetla czasy trwania w przyjaznym dla użytkownika formacie! Zaimplementujesz interfejs fmt.Stringer, aby określić, jak Twoje własne typy są wyświetlane podczas drukowania.
Rozmieścisz swój kod w dwóch plikach:
duration.go: Zdefiniuj typy związane z czasem wraz z własnymi reprezentacjami tekstowymi.Utwórz strukturę
Duration, która przechowuje łączną liczbę minut jako liczbę całkowitą. Zaimplementuj metodęString(), aby podczas drukowania wyświetlała czytelny format, na przykład2h 30mdla 150 minut lub0h 45mdla 45 minut. Godziny i minuty powinny być zawsze wyświetlane.Utwórz strukturę
Taskz polamiName(string) iTime(Duration). Zaimplementuj metodęString()dla Task, aby wyświetlała dane w formacie[Name]: [duration], w którym czas trwania jest formatowany za pomocą własnej metody String.main.go: Utwórz zadania i wyświetl je wraz z czasem ich trwania.Wczytaj liczbę zadań, a następnie dla każdego zadania wczytaj jego nazwę i czas trwania w minutach. Utwórz instancje Task i wydrukuj każdą z nich bezpośrednio za pomocą
fmt.Println: interfejs Stringer automatycznie zajmie się formatowaniem.Po wydrukowaniu wszystkich zadań oblicz i wydrukuj łączny czas wszystkich zadań w formacie:
Total: [duration]
Dane wejściowe będą miały następującą postać:
- Linia 1: Liczba zadań
- Kolejne linie: Nazwa zadania i liczba minut (dwie linie na zadanie)
Na przykład dla danych:
3
Code Review
90
Meeting
45
Documentation
120Oczekiwany wynik:
Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15mA dla danych:
2
Design
180
Testing
65Oczekiwany wynik:
Design: 3h 0m
Testing: 1h 5m
Total: 4h 5mImplementując interfejs Stringer, sprawisz, że Twoje typy będą płynnie współpracować z funkcjami drukującymi Go. Zamiast surowych pól struktury, takich jak {90}, uzyskasz zrozumiały dla użytkowników wynik.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Wczytaj liczbę zadań
line, _ := reader.ReadString('\n')
numTasks, _ := strconv.Atoi(strings.TrimSpace(line))
// TODO: Utwórz slice do przechowywania zadań
// TODO: Śledź łączną liczbę minut
for i := 0; i < numTasks; i++ {
// Wczytaj nazwę zadania
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Wczytaj czas trwania zadania w minutach
minutesLine, _ := reader.ReadString('\n')
minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))
// TODO: Utwórz Task z nazwą i Duration
// TODO: Wypisz zadanie (fmt.Println użyje interfejsu Stringer)
// TODO: Dodaj minuty do sumy
_ = name
_ = minutes
}
// TODO: Wypisz łączny czas trwania w formacie "Total: Xh Ym"
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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ów11Biblioteka standardowa i OOP
io.Reader i io.Writersort.InterfaceInterfejs fmt.Stringerencoding/json ze strukturamiInterfejs http.HandlerPowtórzenie – modele REST API3Wskaź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