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.
Aufgabe
EinfachErstelle 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:
- Die erste Eingabe an den Kommas aufzuteilen, um die einzelnen Meditationsschritte zu erhalten
- Für jeden Schritt an den Doppelpunkten aufzuteilen, um die Anweisung und die Dauer (in Sekunden) zu extrahieren
- Die Dauer-Zeichenfolgen mithilfe des Pakets
strconvin Ganzzahlen umzuwandeln - Die zweite Eingabe in eine Ganzzahl umzuwandeln, um die Anzahl der Zyklen zu erhalten
- Die Sitzungsüberschrift auszugeben:
"=== MEDITATION TIMER ===" - Die Einrichtung der Sitzung auszugeben:
"Starting meditation session with [number_of_cycles] cycles" - Für jeden Zyklus (beginnend mit Zyklus 1):
- Ausgeben:
"--- Cycle [cycle_number] ---" - Für jeden Meditationsschritt:
- Ausgeben:
"[instruction]..." time.Sleepverwenden, um für die angegebene Dauer zu pausieren (die Dauer mittime.Millisecondmultiplizieren, wie intime.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)"
- Ausgeben:
- Nach Abschluss aller Schritte eines Zyklus ausgeben:
"Cycle [cycle_number] finished"
- Ausgeben:
- 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)
- 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
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen7Fehlerbehandlung im Detail
Benutzerdefinierte FehlertypenFehler-Wrapping mit `%w`Unwrapping mit `errors.Is`Unwrapping mit `errors.As``panic` verstehen`recover` verwendenZusammenfassung – Sichere Division10Arbeiten mit Zeit
Aktuelle Zeit abrufenEinen bestimmten Zeitpunkt erstellenZeit formatierenZeit-Strings parsenZeitdauerZeitarithmetikSleeping und TickerZusammenfassung – Einfacher Timer2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und VerhaltenÜbe selbstständig: Online-Go-Compiler