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 erzeugt time.NewTicker einen Ticker, der in festgelegten Intervallen Werte über einen Channel sendet. Dies ist nützlich für Aufgaben, die periodisch ausgeführt werden müssen:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Warten 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.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachErstellen Sie einen Meditations-Sitzungstimer, der time.Sleep verwendet, um Pausen zwischen geführten Anweisungen zu erzeugen, und die grundlegende Zeitsteuerung in Go-Programmen demonstriert.
Sie erhalten zwei Eingaben:
- Einen String, der Meditationsschritte im Format
"step1:duration,step2:duration,step3:duration"enthält (z. B."Breathe in:3,Hold:2,Breathe out:4") - Einen String, der die Anzahl der zu wiederholenden Zyklen enthält (z. B.
"5")
Ihre Aufgabe ist es:
- Die erste Eingabe zu parsen, indem Sie sie an Kommas aufteilen, um die einzelnen Meditationsschritte zu erhalten
- Für jeden Schritt an Doppelpunkten aufzuteilen, um die Anweisung und die Dauer (in Sekunden) zu extrahieren
- Die Dauer-Strings mithilfe des
strconv-Pakets in Ganzzahlen umzuwandeln - Die zweite Eingabe in eine Ganzzahl umzuwandeln, um die Anzahl der Zyklen zu erhalten
- Den Sitzungs-Header anzuzeigen:
"=== MEDITATION TIMER ===" - Das Sitzungs-Setup anzuzeigen:
"Starting meditation session with [number_of_cycles] cycles" - Für jeden Zyklus (beginnend bei Zyklus 1):
- Anzeige:
"--- Cycle [cycle_number] ---" - Für jeden Meditationsschritt:
- Anzeige:
"[instruction]..." - Verwenden Sie
time.Sleep, um für die angegebene Dauer zu pausieren (konvertieren Sie Sekunden intime.Duration, indem Sie mittime.Secondmultiplizieren) - Nach dem Sleep-Befehl, Anzeige:
"[instruction] complete ([duration] seconds)"
- Anzeige:
- Nach Abschluss aller Schritte in einem Zyklus, Anzeige:
"Cycle [cycle_number] finished"
- Anzeige:
- Nachdem alle Zyklen abgeschlossen sind, die Sitzungszusammenfassung anzeigen:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(Summe aller Schrittdauern multipliziert mit der Anzahl der Zyklen)
- Die Abschlussmeldung anzeigen:
"Meditation session finished - well done!"
Verwenden Sie das time-Paket für Sleep-Operationen, das strings-Paket zum Aufteilen von Eingabestrings, das strconv-Paket zum Umwandeln von Strings in Ganzzahlen und das fmt-Paket für die Ausgabe. Denken Sie daran, dass time.Sleep einen time.Duration-Parameter erwartet, daher müssen Sie Ihre Ganzzahl-Sekunden mit time.Second multiplizieren, um den korrekten Dauer-Wert zu erstellen. Diese Herausforderung zeigt, wie man time.Sleep verwendet, um zeitgesteuerte Pausen in der Programmausführung für praktische Anwendungen wie geführte Meditationen oder Übungstimer zu erstellen.
Spickzettel
Verwenden Sie time.Sleep, um die Programmausführung für eine bestimmte Dauer zu pausieren:
time.Sleep(2 * time.Second)Verwenden Sie time.NewTicker, um Aktionen in regelmäßigen Abständen auszuführen:
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)
}Beide Funktionen verwenden time.Duration-Werte. Konvertieren Sie Ganzzahlen in eine Dauer, indem Sie sie mit time.Second multiplizieren.
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