Sleeping und Ticker
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 64 von 68.
Manchmal müssen Sie das Timing der Ausführung Ihres Programms steuern. Go bietet hierfür zwei wesentliche Funktionen im time-Paket an: time.Sleep zum Pausieren der Ausführung und time.NewTicker zum Ausführen von Aktionen in regelmäßigen Abständen.
Die Funktion time.Sleep pausiert Ihr Programm für eine festgelegte Dauer. Sie nimmt eine 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 Channel sendet. Dies 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 // Warte auf den nächsten Tick
fmt.Println("Tick", i+1)
}Diese Timing-Funktionen sind essenziell für das Erstellen von Verzögerungen, das Implementieren von Timeouts und das Planen von wiederkehrenden Operationen in Ihren Go-Programmen.
Aufgabe
EinfachErstelle einen Meditationstimer für Sitzungen, der time.Sleep verwendet, um Pausen zwischen angeleiteten Anweisungen zu erzeugen, und die grundlegende Zeitsteuerung in Go-Programmen demonstriert.
Du erhältst zwei Eingaben:
- Eine Zeichenkette mit Meditationsschritten im Format
"step1:duration,step2:duration,step3:duration"(z. B."Breathe in:3,Hold:2,Breathe out:4") - Eine Zeichenkette mit der Anzahl der zu wiederholenden Zyklen (z. B.
"5")
Deine Aufgabe ist es:
- Die erste Eingabe durch Aufteilen an Kommas zu verarbeiten, um einzelne Meditationsschritte zu erhalten
- Für jeden Schritt an Doppelpunkten aufzuteilen, um die Anweisung und die Dauer (in Sekunden) zu extrahieren
- Die Dauerzeichenketten mithilfe des Pakets
strconvin Ganzzahlen umzuwandeln - Die zweite Eingabe in eine Ganzzahl umzuwandeln, um die Anzahl der Zyklen zu erhalten
- Die Sitzungsüberschrift anzuzeigen:
"=== MEDITATION TIMER ===" - Die Sitzungseinrichtung anzuzeigen:
"Starting meditation session with [number_of_cycles] cycles" - Für jeden Zyklus (beginnend mit Zyklus 1):
- Anzuzeigen:
"--- Cycle [cycle_number] ---" - Für jeden Meditationsschritt:
- Anzuzeigen:
"[instruction]..." time.Sleepzu verwenden, um für die angegebene Dauer zu pausieren (Sekunden durch Multiplikation mittime.Durationintime.Secondumzuwandeln)- Nach dem Schlafen anzuzeigen:
"[instruction] complete ([duration] seconds)"
- Anzuzeigen:
- Nach dem Abschluss aller Schritte in einem Zyklus anzuzeigen:
"Cycle [cycle_number] finished"
- Anzuzeigen:
- Nach dem Abschluss aller Zyklen die Sitzungszusammenfassung anzuzeigen:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(die Summe aller Schrittdauern multipliziert mit der Anzahl der Zyklen)
- Die Abschlussnachricht anzuzeigen:
"Meditation session finished - well done!"
Verwende das Paket time für Schlafoperationen, das Paket strings, um Eingabezeichenketten aufzuteilen, das Paket strconv, um Zeichenketten in Ganzzahlen umzuwandeln, und das Paket fmt für die Ausgabe. Denke daran, dass time.Sleep einen Parameter vom Typ time.Duration erwartet. Daher musst du deine ganzzahligen Sekunden mit time.Second multiplizieren, um den richtigen Dauerwert zu erzeugen. Diese Aufgabe demonstriert, wie time.Sleep verwendet wird, um zeitgesteuerte Pausen in der Programmausführung für praktische Anwendungen wie angeleitete Meditation oder Trainingstimer zu erzeugen.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Eingabe mit bufio.Scanner lesen, um Leerzeichen korrekt zu verarbeiten
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Meditationsschritte und Zyklen parsen
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Schreiben Sie Ihren Code unten
// Jeden Schritt parsen, um Anweisung und Dauer zu extrahieren
// Denken Sie daran zu prüfen, ob der Parts-Slice genügend Elemente hat, bevor Sie darauf zugreifen
// Sitzungs-Header und Setup anzeigen
// Durch Zyklen und Schritte iterieren
// time.Sleep für Pausen verwenden (erwägen Sie die Verwendung von Millisekunden zum Testen)
// Abschlussmeldungen und Zusammenfassung anzeigen
}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