Resumen - Temporizador simple
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 65 de 68.
Desafío
FácilCrea una aplicación de temporizador de cuenta regresiva que use time.NewTicker para contar desde una duración especificada hasta cero, mostrando mensajes de progreso a intervalos regulares. Este desafío pondrá a prueba tu capacidad para combinar tickers, bucles y cálculos de duración con el fin de crear una aplicación funcional de medición del tiempo.
Recibirás dos entradas:
- Una cadena que contiene la duración de la cuenta regresiva con el formato
"value:unit"(por ejemplo,"10:Second"o"3:Minute") - Una cadena que contiene el intervalo de actualización con el formato
"value:unit"(por ejemplo,"1:Second")
Tu tarea es:
- Analizar la primera entrada separándola por dos puntos para extraer el valor y la unidad de la duración de la cuenta regresiva
- Analizar la segunda entrada separándola por dos puntos para extraer el valor y la unidad del intervalo de actualización
- Convertir los valores de cadena a enteros usando el paquete
strconv - Crear objetos
time.Durationpara la duración de la cuenta regresiva y el intervalo de actualización usando las constantes apropiadas:- Para
"Second": multiplicar portime.Second - Para
"Minute": multiplicar portime.Minute - Para
"Hour": multiplicar portime.Hour
- Para
- Mostrar el encabezado del temporizador:
"=== COUNTDOWN TIMER ===" - Mostrar la configuración del temporizador:
"Starting countdown from [countdown_duration_object]" - Mostrar la frecuencia de actualización:
"Updates every [update_interval_object]" - Crear un ticker usando
time.NewTickercon la duración del intervalo de actualización - Inicializar una variable de tiempo restante con la duración de la cuenta regresiva
- Usar un bucle para realizar la cuenta regresiva:
- Esperar cada evento del ticker usando
<-ticker.C - Restar el intervalo de actualización del tiempo restante
- Si el tiempo restante es mayor que 0, mostrar:
"Time remaining: [remaining_time_object]" - Si el tiempo restante es 0 o menos, mostrar:
"Time's up!"y salir del bucle
- Esperar cada evento del ticker usando
- Detener el ticker usando
ticker.Stop() - Mostrar las estadísticas de finalización:
"=== TIMER COMPLETE ===""Original duration: [countdown_duration_object]""Update interval: [update_interval_object]""Total updates displayed: [number_of_updates]"(calcula cuántas veces se mostró el tiempo restante)
- Mostrar el mensaje de finalización:
"Countdown timer finished successfully"
Usa el paquete time para las operaciones del ticker y de duración, el paquete strings para separar las cadenas de entrada, el paquete strconv para convertir las cadenas a enteros y el paquete fmt para la salida. Recuerda que time.NewTicker devuelve un ticker que envía valores a través de su canal a intervalos regulares, y debes llamar a ticker.Stop() cuando hayas terminado para liberar recursos. Este desafío demuestra cómo crear un temporizador práctico de cuenta regresiva usando los mecanismos de medición del tiempo de Go.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Leer entrada
var countdownInput string
var intervalInput string
fmt.Scanln(&countdownInput)
fmt.Scanln(&intervalInput)
// Analizar la entrada de la duración de la cuenta regresiva
countdownParts := strings.Split(countdownInput, ":")
countdownValue, _ := strconv.Atoi(countdownParts[0])
countdownUnit := countdownParts[1]
// Analizar la entrada del intervalo de actualización
intervalParts := strings.Split(intervalInput, ":")
intervalValue, _ := strconv.Atoi(intervalParts[0])
intervalUnit := intervalParts[1]
// TODO: Escribe tu código a continuación
// Convertir a objetos time.Duration usando sentencias switch
// Crear el temporizador de cuenta regresiva (simular sin retrasos reales para pruebas)
// Implementar el bucle de cuenta regresiva
// Mostrar todos los mensajes y estadísticas requeridos
// Nota: Para fines de prueba, simula el comportamiento del ticker sin retrasos de tiempo reales
}Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea7Manejo de errores a fondo
Tipos de error personalizadosEnvolver errores con `%w`Desenvolver con `errors.Is`Desenvolver con `errors.As`Entendiendo `panic`Uso de `recover`Repaso - División segura10Trabajando con el tiempo
Obtener la hora actualCrear una hora específicaFormatear el tiempoParsing de cadenas de tiempoDuración del tiempoAritmética de tiempoSleeping y TickersResumen - Temporizador simple2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientosPractica por tu cuenta: Compilador de Go online