Menu
CoddyTech

Sleeping und Ticker

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 64 von 68.

Manchmal musst du den Zeitpunkt der Ausführung deines Programms steuern. Go stellt dafür zwei wichtige Funktionen im Paket time bereit: time.Sleep, um die Ausführung anzuhalten, und time.NewTicker, um Aktionen in regelmäßigen Abständen auszuführen.

Die Funktion time.Sleep pausiert dein Programm für eine angegebene Dauer. Sie nimmt einen time.Duration als Parameter entgegen und blockiert die Ausführung, bis diese Zeit verstrichen ist:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

Für wiederholte Aktionen in regelmäßigen Abständen erstellt time.NewTicker einen Ticker, der in festgelegten Intervallen Werte über einen Kanal sendet. Das ist nützlich für Aufgaben, die regelmäßig ausgeführt werden müssen:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // Auf den nächsten Tick warten
    fmt.Println("Tick", i+1)
}

Diese Zeitfunktionen sind unerlässlich, um Verzögerungen zu erzeugen, Zeitüberschreitungen zu implementieren und wiederkehrende Vorgänge in deinen Go-Programmen zu planen.

challenge icon

Aufgabe

Einfach

Erstelle einen Timer für eine Meditationssitzung, der time.Sleep verwendet, um Pausen zwischen angeleiteten Anweisungen einzulegen, und die grundlegende Zeitsteuerung in Go-Programmen demonstriert.

Du erhältst zwei Eingaben:

  • Eine Zeichenfolge mit Meditationsschritten im Format "step1:duration,step2:duration,step3:duration" (z. B. "Breathe in:3,Hold:2,Breathe out:4")
  • Eine Zeichenfolge mit der Anzahl der Wiederholungszyklen (z. B. "5")

Deine Aufgabe ist es:

  1. Die erste Eingabe an den Kommas aufzuteilen, um die einzelnen Meditationsschritte zu erhalten
  2. Für jeden Schritt an den Doppelpunkten aufzuteilen, um die Anweisung und die Dauer (in Sekunden) zu extrahieren
  3. Die Dauer-Zeichenfolgen mithilfe des Pakets strconv in Ganzzahlen umzuwandeln
  4. Die zweite Eingabe in eine Ganzzahl umzuwandeln, um die Anzahl der Zyklen zu erhalten
  5. Die Sitzungsüberschrift auszugeben: "=== MEDITATION TIMER ==="
  6. Die Einrichtung der Sitzung auszugeben: "Starting meditation session with [number_of_cycles] cycles"
  7. Für jeden Zyklus (beginnend mit Zyklus 1):
    • Ausgeben: "--- Cycle [cycle_number] ---"
    • Für jeden Meditationsschritt:
      • Ausgeben: "[instruction]..."
      • time.Sleep verwenden, um für die angegebene Dauer zu pausieren (die Dauer mit time.Millisecond multiplizieren, wie in time.Duration(duration) * time.Millisecond, damit die Prüfungen schnell abgeschlossen werden; in der Ausgabe steht weiterhin die Dauer in Sekunden)
      • Nach der Pause ausgeben: "[instruction] complete ([duration] seconds)"
    • Nach Abschluss aller Schritte eines Zyklus ausgeben: "Cycle [cycle_number] finished"
  8. Nach Abschluss aller Zyklen die Sitzungszusammenfassung ausgeben:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (Summe der Dauer aller Schritte multipliziert mit der Anzahl der Zyklen)
  9. Die Abschlussnachricht ausgeben: "Meditation session finished - well done!"

Verwende das Paket time für Pausen, das Paket strings, um Eingabezeichenfolgen aufzuteilen, das Paket strconv, um Zeichenfolgen in Ganzzahlen umzuwandeln, und das Paket fmt für die Ausgabe. Beachte, dass time.Sleep einen Parameter vom Typ time.Duration erwartet. Wandle daher zuerst die Ganzzahl um: time.Duration(duration) * time.Millisecond. Ein echter Timer würde time.Second verwenden, aber Pausen von ganzen Sekunden führen dazu, dass die Prüfungen wegen Zeitüberschreitung abbrechen. Diese Aufgabe zeigt, wie du time.Sleep verwendest, um zeitgesteuerte Pausen während der Programmausführung einzulegen, etwa für praktische Anwendungen wie angeleitete Meditation oder Timer für Übungen.

Probier es selbst

package main

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

func main() {
	// Lies die Eingabe mit bufio.Scanner ein, um Leerzeichen korrekt zu verarbeiten
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// Analysiere die Meditationsschritte und Zyklen
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Schreibe deinen Code unten
	// Analysiere jeden Schritt, um Anweisung und Dauer zu ermitteln
	// Prüfe vor dem Zugriff, ob der Slice parts genügend Elemente enthält
	// Zeige den Sitzungskopf und die Einrichtung an
	// Durchlaufe die Zyklen und Schritte
	// Verwende time.Sleep für Pausen: time.Duration(duration) * time.Millisecond
	// Zeige Abschlussmeldungen und eine Zusammenfassung an
	
}
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 Logik & Ablauf

Übe selbstständig: Online-Go-Compiler