Uśpienia i tickery
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 64 z 68.
Czasami musisz kontrolować czas wykonywania programu. Go udostępnia w pakiecie time dwie podstawowe funkcje: time.Sleep do wstrzymywania wykonywania oraz time.NewTicker do wykonywania czynności w regularnych odstępach czasu.
Funkcja time.Sleep wstrzymuje działanie programu na określony czas. Przyjmuje time.Duration jako parametr i blokuje wykonywanie programu, dopóki ten czas nie upłynie:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")W przypadku powtarzających się czynności wykonywanych w regularnych odstępach czasu time.NewTicker tworzy ticker, który wysyła wartości przez kanał w określonych odstępach. Jest to przydatne w przypadku zadań, które muszą być wykonywane okresowo:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Poczekaj na następny takt
fmt.Println("Tick", i+1)
}Te funkcje odmierzające czas są niezbędne do tworzenia opóźnień, implementowania limitów czasu i planowania cyklicznych operacji w programach Go.
Wyzwanie
ŁatwyUtwórz timer sesji medytacyjnej, który używa time.Sleep do tworzenia przerw między instrukcjami z przewodnikiem i pokazuje podstawowe sterowanie czasem w programach Go.
Otrzymasz dwa wejścia:
- Ciąg znaków zawierający kroki medytacji w formacie
"step1:duration,step2:duration,step3:duration"(np."Breathe in:3,Hold:2,Breathe out:4") - Ciąg znaków zawierający liczbę powtórzeń cyklu (np.
"5")
Twoje zadanie:
- Przetwórz pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne kroki medytacji
- Podziel każdy krok po dwukropkach, aby wyodrębnić instrukcję i czas trwania (w sekundach)
- Przekonwertuj ciągi znaków określające czas trwania na liczby całkowite za pomocą pakietu
strconv - Przekonwertuj drugie wejście na liczbę całkowitą, aby uzyskać liczbę cykli
- Wyświetl nagłówek sesji:
"=== MEDITATION TIMER ===" - Wyświetl konfigurację sesji:
"Starting meditation session with [number_of_cycles] cycles" - Dla każdego cyklu (zaczynając od cyklu 1):
- Wyświetl:
"--- Cycle [cycle_number] ---" - Dla każdego kroku medytacji:
- Wyświetl:
"[instruction]..." - Użyj
time.Sleep, aby zrobić przerwę o określonym czasie trwania (pomnóż czas trwania przeztime.Millisecond, tak jak wtime.Duration(duration) * time.Millisecond, aby testy kończyły się szybko; wyjście nadal podaje czas w sekundach) - Po uśpieniu wyświetl:
"[instruction] complete ([duration] seconds)"
- Wyświetl:
- Po wykonaniu wszystkich kroków w cyklu wyświetl:
"Cycle [cycle_number] finished"
- Wyświetl:
- Po zakończeniu wszystkich cykli wyświetl podsumowanie sesji:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(suma czasów trwania wszystkich kroków pomnożona przez liczbę cykli)
- Wyświetl komunikat o zakończeniu:
"Meditation session finished - well done!"
Użyj pakietu time do operacji uśpienia, pakietu strings do dzielenia ciągów wejściowych, pakietu strconv do konwertowania ciągów znaków na liczby całkowite, a pakietu fmt do wyświetlania danych. Pamiętaj, że time.Sleep przyjmuje parametr typu time.Duration, dlatego najpierw przekonwertuj liczbę całkowitą: time.Duration(duration) * time.Millisecond. Prawdziwy timer używałby time.Second, ale przerwy trwające pełne sekundy powodują przekroczenie limitu czasu testów. To wyzwanie pokazuje, jak używać time.Sleep do tworzenia czasowych przerw w wykonywaniu programu w praktycznych zastosowaniach, takich jak medytacja z przewodnikiem lub timery ćwiczeń.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Odczytaj dane wejściowe za pomocą bufio.Scanner, aby poprawnie obsłużyć spacje
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Przetwórz etapy medytacji i cykle
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Napisz swój kod poniżej
// Przetwórz każdy etap, aby wyodrębnić instrukcję i czas trwania
// Pamiętaj, aby przed odwołaniem się do elementów sprawdzić, czy wycinek parts zawiera ich wystarczająco dużo
// Wyświetl nagłówek sesji i informacje o konfiguracji
// Wykonaj pętlę po cyklach i etapach
// Użyj time.Sleep do wprowadzania przerw: time.Duration(duration) * time.Millisecond
// Wyświetl komunikaty o zakończeniu i podsumowanie
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online