Menu
Coddy logo textTech

fmt.Stringer Interface

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 75 von 107.

Das fmt.Stringer-Interface steuert, wie Ihre Typen bei der Ausgabe dargestellt werden. Es ist eines der am häufigsten implementierten Interfaces in Go und wird im fmt-Paket definiert:

type Stringer interface {
    String() string
}

Wenn Sie einen Wert an fmt.Println, fmt.Printf mit %v oder ähnliche Funktionen übergeben, prüft Go, ob der Typ Stringer implementiert. Falls dies der Fall ist, ruft Go die String()-Methode auf, um die Textdarstellung zu erhalten.

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
}

Ohne die String()-Methode würde die Ausgabe das Standard-Struct-Format anzeigen: {23.5}. Durch die Implementierung von Stringer steuern Sie genau, wie sich Ihr Typ darstellt.

Dies ist besonders nützlich für Typen, bei denen die rohen Feldwerte die Bedeutung nicht klar vermitteln. Ein Duration-Typ könnte als „2h 30m“ angezeigt werden, anstatt rohe Nanosekunden anzuzeigen, oder ein User-Typ könnte einen formatierten Namen anstelle all seiner Felder anzeigen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Zeiterfassungssystem bauen, das Zeitdauern in einem benutzerfreundlichen Format anzeigt! Sie werden das fmt.Stringer-Interface implementieren, um zu steuern, wie Ihre benutzerdefinierten Typen beim Drucken erscheinen.

Sie werden Ihren Code auf zwei Dateien aufteilen:

  • duration.go: Definieren Sie Ihre zeitbezogenen Typen mit benutzerdefinierten String-Repräsentationen.

    Erstellen Sie ein Duration-Struct, das eine Gesamtzahl von Minuten als Ganzzahl speichert. Implementieren Sie die String()-Methode so, dass sie beim Drucken in einem lesbaren Format wie 2h 30m für 150 Minuten oder 0h 45m für 45 Minuten angezeigt wird. Stunden und Minuten sollten immer angezeigt werden.

    Erstellen Sie ein Task-Struct mit Feldern für Name (String) und Time (Duration). Implementieren Sie String() für Task, um es im Format [Name]: [duration] anzuzeigen, wobei die Dauer ihre eigene String-Methode verwendet.

  • main.go: Erstellen und Anzeigen von Aufgaben mit ihren Zeitdauern.

    Lesen Sie eine Anzahl von Aufgaben ein, und lesen Sie dann für jede Aufgabe ihren Namen und die Dauer in Minuten. Erstellen Sie Task-Instanzen und drucken Sie jede einzelne direkt mit fmt.Println aus – das Stringer-Interface übernimmt die Formatierung automatisch.

    Nachdem Sie alle Aufgaben gedruckt haben, berechnen und drucken Sie die Gesamtzeit aller Aufgaben im Format:

    Total: [duration]

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Anzahl der Aufgaben
  • Folgende Zeilen: Aufgabenname und Minuten (zwei Zeilen pro Aufgabe)

Zum Beispiel, gegeben:

3
Code Review
90
Meeting
45
Documentation
120

Ihre Ausgabe sollte sein:

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

Und gegeben:

2
Design
180
Testing
65

Ihre Ausgabe sollte sein:

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

Durch die Implementierung von Stringer lassen sich Ihre Typen nahtlos in die Druckfunktionen von Go integrieren. Anstatt rohe Struct-Felder wie {90} zu sehen, erhalten Sie eine aussagekräftige Ausgabe, die für Benutzer sinnvoll ist.

Spickzettel

Das fmt.Stringer-Interface steuert, wie Typen beim Drucken erscheinen:

type Stringer interface {
    String() string
}

Wenn Sie einen Wert an fmt.Println oder fmt.Printf mit %v übergeben, prüft Go, ob der Typ Stringer implementiert. Falls ja, ruft Go die Methode String() auf, um die Textdarstellung zu erhalten.

Beispiel-Implementierung:

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
}

Ohne die Methode String() zeigt die Ausgabe das Standardformat für Structs: {23.5}. Durch die Implementierung von Stringer steuern Sie genau, wie sich Ihr Typ präsentiert, wodurch die Ausgabe aussagekräftiger und benutzerfreundlicher wird.

Probier es selbst

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Anzahl der Aufgaben lesen
	line, _ := reader.ReadString('\n')
	numTasks, _ := strconv.Atoi(strings.TrimSpace(line))

	// TODO: Erstelle ein Slice, um Aufgaben zu speichern
	// TODO: Verfolge die Gesamtzahl der Minuten

	for i := 0; i < numTasks; i++ {
		// Aufgabennamen lesen
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)

		// Aufgabendauer in Minuten lesen
		minutesLine, _ := reader.ReadString('\n')
		minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))

		// TODO: Erstelle eine Aufgabe (Task) mit dem Namen und der Dauer (Duration)
		// TODO: Gib die Aufgabe aus (fmt.Println wird das Stringer-Interface verwenden)
		// TODO: Minuten zur Gesamtsumme hinzufügen
		_ = name
		_ = minutes
	}

	// TODO: Gib die Gesamtdauer im Format "Total: Xh Ym" aus
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung