Ожидание и тикеры
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 64 из 68.
Иногда вам нужно контролировать время выполнения вашей программы. Go предоставляет для этого две основные функции в пакете time: time.Sleep для приостановки выполнения и time.NewTicker для выполнения действий через регулярные интервалы.
Функция time.Sleep приостанавливает выполнение вашей программы на указанный период времени. Она принимает time.Duration в качестве параметра и блокирует выполнение до тех пор, пока это время не истечет:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")Для повторяющихся действий через регулярные интервалы time.NewTicker создает тикер, который отправляет значения в канал через указанные интервалы. Это полезно для задач, которые должны выполняться периодически:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Ожидание следующего тика
fmt.Println("Tick", i+1)
}Эти функции для работы со временем необходимы для создания задержек, реализации тайм-аутов и планирования повторяющихся операций в ваших программах на Go.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте таймер для сеанса медитации, который использует time.Sleep для создания пауз между голосовыми инструкциями и демонстрирует базовое управление временем в программах на Go.
Вы получите два входных значения:
- Строку, содержащую шаги медитации в формате
"step1:duration,step2:duration,step3:duration"(например,"Breathe in:3,Hold:2,Breathe out:4") - Строку, содержащую количество циклов повторения (например,
"5")
Ваша задача:
- Разобрать первый входной параметр, разделив его по запятым, чтобы получить отдельные шаги медитации
- Для каждого шага выполнить разделение по двоеточию, чтобы извлечь инструкцию и длительность (в секундах)
- Преобразовать строки длительности в целые числа, используя пакет
strconv - Преобразовать второй входной параметр в целое число, чтобы получить количество циклов
- Вывести заголовок сеанса:
"=== MEDITATION TIMER ===" - Вывести настройки сеанса:
"Starting meditation session with [number_of_cycles] cycles" - Для каждого цикла (начиная с цикла 1):
- Вывести:
"--- Cycle [cycle_number] ---" - Для каждого шага медитации:
- Вывести:
"[instruction]..." - Использовать
time.Sleepдля паузы на указанную длительность (преобразуйте секунды вtime.Duration, умножив наtime.Second) - После паузы вывести:
"[instruction] complete ([duration] seconds)"
- Вывести:
- После завершения всех шагов в цикле вывести:
"Cycle [cycle_number] finished"
- Вывести:
- После завершения всех циклов вывести сводку сеанса:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(сумма длительностей всех шагов, умноженная на количество циклов)
- Вывести сообщение о завершении:
"Meditation session finished - well done!"
Используйте пакет time для операций сна, пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для вывода. Помните, что time.Sleep принимает параметр типа time.Duration, поэтому вам нужно умножить ваши целые секунды на time.Second, чтобы создать правильное значение длительности. Эта задача демонстрирует, как использовать time.Sleep для создания временных пауз в выполнении программы для практических приложений, таких как таймеры для медитации или физических упражнений.
Шпаргалка
Используйте time.Sleep, чтобы приостановить выполнение программы на заданный промежуток времени:
time.Sleep(2 * time.Second)Используйте time.NewTicker для выполнения действий через регулярные интервалы:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Wait for the next tick
fmt.Println("Tick", i+1)
}Обе функции используют значения time.Duration. Преобразуйте целые числа в продолжительность, умножая их на time.Second.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Чтение ввода с использованием bufio.Scanner для корректной обработки пробелов
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Разбор шагов медитации и количества циклов
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Напишите свой код ниже
// Разберите каждый шаг, чтобы извлечь инструкцию и длительность
// Не забудьте проверить, достаточно ли элементов в срезе parts перед доступом
// Отобразите заголовок сессии и настройки
// Пройдите циклом по количеству повторений и шагам
// Используйте time.Sleep для пауз (рассмотрите использование миллисекунд для тестирования)
// Отобразите сообщения о завершении и сводку
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение