Menu
Coddy logo textTech

Interfejsy Stringer i Error

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 32 z 107.

Biblioteka standardowa Go definiuje dwa interfejsy, których będziesz często używać: fmt.Stringer i error. Oba są prostymi interfejsami z jedną metodą, które zapewniają typom zaawansowaną integrację z wbudowanymi funkcjami Go.

Interfejs Stringer znajduje się w pakiecie fmt i wymaga tylko jednej metody:

type Stringer interface {
    String() string
}

Gdy zaimplementujesz String() dla swojego typu, funkcje takie jak fmt.Println automatycznie użyją jej do wyświetlenia wartości:

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("%s (%d years old)", p.Name, p.Age)
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    fmt.Println(p)  // Alice (30 lat)
}

Interfejs błędu jest równie prosty i wymaga metody Error(), która zwraca ciąg znaków:

type error interface {
    Error() string
}

Każdy typ z metodą Error() może być użyty jako wartość błędu w Go. Dzięki temu możesz tworzyć własne typy błędów z dodatkowymi informacjami:

type ValidationError struct {
    Field   string
    Message string
}

func (e ValidationError) Error() string {
    return fmt.Sprintf("%s: %s", e.Field, e.Message)
}

func main() {
    err := ValidationError{Field: "email", Message: "invalid format"}
    fmt.Println(err)  // email: invalid format
}

Te dwa interfejsy ilustrują filozofię Go: małe, skoncentrowane interfejsy, które umożliwiają potężne działanie dzięki niejawnym implementacjom.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system monitorowania temperatury, który wykorzystuje interfejsy Stringer i error, aby zapewnić czytelny wynik i sensowną obsługę błędów.

Rozmieścisz kod w dwóch plikach:

  • temperature.go: Utwórz strukturę Temperature z polami Value (float64) i Unit (string). Zaimplementuj metodę String(), aby wyświetlała temperaturę w czytelnym dla człowieka formacie. Utwórz także strukturę TemperatureError z polami Temp (float64) i Reason (string) oraz zaimplementuj metodę Error(), aby zwracała opisowe komunikaty o błędach.
  • main.go: Utwórz funkcję o nazwie ValidateTemperature, która przyjmuje wartość typu Temperature i zwraca błąd, jeśli temperatura jest nieprawidłowa. Temperatura jest nieprawidłowa, jeśli jest niższa od zera absolutnego (-273.15 dla Celsjusza, -459.67 dla Fahrenheita). Jeśli jest prawidłowa, funkcja zwraca nil. Odczytaj dane o temperaturze z wejścia, utwórz wartość typu Temperature, sprawdź jej poprawność i wyświetl odpowiedni wynik.

Podane zostaną następujące dane wejściowe:

  • Wiersz 1: Wartość temperatury (float)
  • Wiersz 2: Jednostka (C dla Celsjusza lub F dla Fahrenheita)

Metoda String() powinna zwracać wynik w formacie:

[Value] degrees [Unit]

Gdzie Unit to pełne słowo "Celsius" lub "Fahrenheit", zależnie od wejścia.

Metoda Error() powinna zwracać wynik w formacie:

invalid temperature [Temp]: [Reason]

Jeśli temperatura jest prawidłowa, wyświetl Temperature za pomocą fmt.Println (które użyje Twojej metody String()). Jeśli jest nieprawidłowa, wyświetl błąd (który użyje Twojej metody Error()).

Na przykład dla wartości 25.5 i C wynik powinien być następujący:

25.5 degrees Celsius

Dla wartości -500 i F wynik powinien być następujący:

invalid temperature -500: below absolute zero

Użyj "below absolute zero" jako powodu, gdy temperatura jest zbyt niska.

Spróbuj swoich sił

package main

import (
	"fmt"
)

// ValidateTemperature sprawdza, czy temperatura jest prawidłowa
// Zwraca błąd, jeśli temperatura jest niższa od zera bezwzględnego
// Zero bezwzględne: -273.15 dla Celsius, -459.67 dla Fahrenheit
func ValidateTemperature(t Temperature) error {
	// TODO: Zaimplementuj logikę walidacji
	// Sprawdź, czy temperatura jest niższa od zera bezwzględnego, uwzględniając jednostkę
	// Zwróć TemperatureError, jeśli temperatura jest nieprawidłowa, lub nil, jeśli jest prawidłowa
	return nil
}

func main() {
	var value float64
	var unit string
	fmt.Scanln(&value)
	fmt.Scanln(&unit)

	// TODO: Utwórz strukturę Temperature z wartościami wejściowymi

	// TODO: Sprawdź poprawność temperatury za pomocą ValidateTemperature

	// TODO: Jeśli wystąpi błąd, wypisz go
	// W przeciwnym razie wypisz temperaturę (zostanie użyta metoda String())
}
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