Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ład 2h 30m dla 150 minut lub 0h 45m dla 45 minut. Godziny i minuty powinny być zawsze wyświetlane.

    Utwórz strukturę Task z polami Name (string) i Time (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
120

Oczekiwany wynik:

Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15m

A dla danych:

2
Design
180
Testing
65

Oczekiwany wynik:

Design: 3h 0m
Testing: 1h 5m
Total: 4h 5m

Implementują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"
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online