Uśpienia i tickery
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 64 z 68.
Czasami trzeba kontrolować czas wykonywania programu. Go udostępnia w pakiecie time dwie niezbędne funkcje: time.Sleep do wstrzymywania wykonywania oraz time.NewTicker do wykonywania działań 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 do upływu tego czasu:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")W przypadku powtarzających się działań w regularnych odstępach czasu time.NewTicker tworzy ticker, który wysyła wartości na kanale w określonych odstępach. Jest to przydatne w przypadku zadań, które muszą być wykonywane cyklicznie:
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 prowadzonymi i demonstruje podstawową kontrolę czasu w programach Go.
Otrzymasz dwa wejścia:
- Łańcuch zawierający kroki medytacji w formacie
"step1:duration,step2:duration,step3:duration"(np."Breathe in:3,Hold:2,Breathe out:4") - Łańcuch zawierający liczbę powtórzeń cyklu (np.
"5")
Twoje zadanie:
- Przeanalizować pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne kroki medytacji
- Dla każdego kroku podzielić go po dwukropkach, aby wyodrębnić instrukcję i czas trwania (w sekundach)
- Przekonwertować łańcuchy czasu trwania na liczby całkowite za pomocą pakietu
strconv - Przekonwertować drugie wejście na liczbę całkowitą, aby uzyskać liczbę cykli
- Wyświetlić nagłówek sesji:
"=== MEDITATION TIMER ===" - Wyświetlić konfigurację sesji:
"Starting meditation session with [number_of_cycles] cycles" - Dla każdego cyklu (zaczynając od cyklu 1):
- Wyświetlić:
"--- Cycle [cycle_number] ---" - Dla każdego kroku medytacji:
- Wyświetlić:
"[instruction]..." - Użyć
time.Sleep, aby wstrzymać wykonanie na określony czas (przekonwertować sekundy natime.Duration, mnożąc przeztime.Second) - Po uśpieniu wyświetlić:
"[instruction] complete ([duration] seconds)"
- Wyświetlić:
- Po wykonaniu wszystkich kroków w cyklu wyświetlić:
"Cycle [cycle_number] finished"
- Wyświetlić:
- Po zakończeniu wszystkich cykli wyświetlić 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świetlić komunikat o ukończeniu:
"Meditation session finished - well done!"
Użyj pakietu time do operacji uśpienia, pakietu strings do dzielenia łańcuchów wejściowych, pakietu strconv do konwertowania łańcuchów na liczby całkowite oraz pakietu fmt do wyświetlania danych. Pamiętaj, że time.Sleep przyjmuje parametr typu time.Duration, więc musisz pomnożyć liczbę sekund przez time.Second, aby utworzyć odpowiednią wartość czasu trwania. To wyzwanie pokazuje, jak używać time.Sleep do tworzenia czasowych przerw w wykonywaniu programu w praktycznych zastosowaniach, takich jak timery do medytacji prowadzonej lub ć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 wycinka parts sprawdzić, czy jest ich wystarczająco dużo
// Wyświetl nagłówek sesji i informacje o konfiguracji
// Przejdź w pętli przez cykle i etapy
// Użyj time.Sleep do wprowadzania przerw (rozważ użycie milisekund podczas testowania)
// 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