Итоги — Простой таймер
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 65 из 68.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте приложение обратного отсчета, которое использует time.NewTicker для отсчета времени от заданной продолжительности до нуля, отображая сообщения о прогрессе через регулярные интервалы. Эта задача проверит вашу способность комбинировать тикеры, циклы и вычисления продолжительности для создания функционального приложения для замера времени.
Вы получите два входных значения:
- Строка, содержащая продолжительность обратного отсчета в формате
"value:unit"(например,"10:Second"или"3:Minute") - Строка, содержащая интервал обновления в формате
"value:unit"(например,"1:Second")
Ваша задача:
- Разобрать первый ввод, разделив его по двоеточию, чтобы извлечь значение и единицу измерения продолжительности обратного отсчета
- Разобрать второй ввод, разделив его по двоеточию, чтобы извлечь значение и единицу измерения интервала обновления
- Преобразовать строковые значения в целые числа с помощью пакета
strconv - Создать объекты
time.Durationкак для продолжительности обратного отсчета, так и для интервала обновления, используя соответствующие константы:- Для
"Second": умножить наtime.Second - Для
"Minute": умножить наtime.Minute - Для
"Hour": умножить наtime.Hour
- Для
- Вывести заголовок таймера:
"=== COUNTDOWN TIMER ===" - Вывести настройки таймера:
"Starting countdown from [countdown_duration_object]" - Вывести частоту обновления:
"Updates every [update_interval_object]" - Создать тикер с помощью
time.NewTickerс длительностью интервала обновления - Инициализировать переменную оставшегося времени значением продолжительности обратного отсчета
- Использовать цикл для обратного отсчета:
- Ожидать каждого события тикера с помощью
<-ticker.C - Вычитать интервал обновления из оставшегося времени
- Если оставшееся время больше 0, вывести:
"Time remaining: [remaining_time_object]" - Если оставшееся время 0 или меньше, вывести:
"Time's up!"и выйти из цикла
- Ожидать каждого события тикера с помощью
- Остановить тикер с помощью
ticker.Stop() - Вывести статистику завершения:
"=== TIMER COMPLETE ===""Original duration: [countdown_duration_object]""Update interval: [update_interval_object]""Total updates displayed: [number_of_updates]"(рассчитайте, сколько раз было отображено оставшееся время)
- Вывести сообщение о завершении:
"Countdown timer finished successfully"
Используйте пакет time для операций с тикером и продолжительностью, пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для вывода. Помните, что time.NewTicker возвращает тикер, который отправляет значения в свой канал через регулярные интервалы, и вы должны вызвать ticker.Stop(), когда закончите, чтобы освободить ресурсы. Эта задача демонстрирует, как создать практичный таймер обратного отсчета, используя механизмы синхронизации Go.
Попробуйте сами
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Чтение входных данных
var countdownInput string
var intervalInput string
fmt.Scanln(&countdownInput)
fmt.Scanln(&intervalInput)
// Разбор входных данных длительности обратного отсчета
countdownParts := strings.Split(countdownInput, ":")
countdownValue, _ := strconv.Atoi(countdownParts[0])
countdownUnit := countdownParts[1]
// Разбор входных данных интервала обновления
intervalParts := strings.Split(intervalInput, ":")
intervalValue, _ := strconv.Atoi(intervalParts[0])
intervalUnit := intervalParts[1]
// TODO: Напишите свой код ниже
// Преобразование в объекты time.Duration с использованием операторов switch
// Создание таймера обратного отсчета (имитация без реальных задержек для тестирования)
// Реализация цикла обратного отсчета
// Отображение всех необходимых сообщений и статистики
// Примечание: Для целей тестирования имитируйте поведение тикера без реальных задержек во времени
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи7Углубленная обработка ошибок
Пользовательские типы ошибокОбертывание ошибок с помощью `%w`Распаковка с помощью `errors.Is`Распаковка с помощью `errors.As`Понимание `panic`Использование `recover`Итоги: Безопасное деление10Работа со временем
Получение текущего времениСоздание конкретного времениФорматирование времениПарсинг строк времениДлительность времениАрифметика времениОжидание и тикерыИтоги — Простой таймер2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение