Sleeping y Tickers
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 64 de 68.
A veces necesitas controlar el tiempo de ejecución de tu programa. Go proporciona dos funciones esenciales en el paquete time para ello: time.Sleep para pausar la ejecución y time.NewTicker para realizar acciones a intervalos regulares.
La función time.Sleep pausa tu programa durante un tiempo especificado. Toma un time.Duration como parámetro y bloquea la ejecución hasta que haya transcurrido ese tiempo:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")Para realizar acciones repetidas a intervalos regulares, time.NewTicker crea un ticker que envía valores por un canal a intervalos especificados. Esto es útil para tareas que deben ejecutarse periódicamente:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Espera al siguiente tick
fmt.Println("Tick", i+1)
}Estas funciones de temporización son esenciales para crear retrasos, implementar tiempos de espera y programar operaciones recurrentes en tus programas de Go.
Desafío
FácilCrea un temporizador de sesiones de meditación que use time.Sleep para crear pausas entre instrucciones guiadas y mostrar el control básico del tiempo en programas Go.
Recibirás dos entradas:
- Una cadena que contiene pasos de meditación con el formato
"step1:duration,step2:duration,step3:duration"(p. ej.,"Breathe in:3,Hold:2,Breathe out:4") - Una cadena que contiene el número de ciclos que se repetirán (p. ej.,
"5")
Tu tarea es:
- Analizar la primera entrada separándola por comas para obtener los pasos de meditación individuales
- Para cada paso, separarlo por dos puntos para extraer la instrucción y la duración (en segundos)
- Convertir las cadenas de duración a números enteros usando el paquete
strconv - Convertir la segunda entrada a un número entero para obtener el número de ciclos
- Mostrar el encabezado de la sesión:
"=== MEDITATION TIMER ===" - Mostrar la configuración de la sesión:
"Starting meditation session with [number_of_cycles] cycles" - Para cada ciclo (empezando por el ciclo 1):
- Mostrar:
"--- Cycle [cycle_number] ---" - Para cada paso de meditación:
- Mostrar:
"[instruction]..." - Usar
time.Sleeppara pausar durante la duración especificada (multiplicar la duración portime.Millisecond, como entime.Duration(duration) * time.Millisecond, para que las comprobaciones terminen rápido; la salida sigue indicando segundos) - Después de la pausa, mostrar:
"[instruction] complete ([duration] seconds)"
- Mostrar:
- Después de completar todos los pasos de un ciclo, mostrar:
"Cycle [cycle_number] finished"
- Mostrar:
- Cuando se hayan completado todos los ciclos, mostrar el resumen de la sesión:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(la suma de las duraciones de todos los pasos multiplicada por el número de ciclos)
- Mostrar el mensaje de finalización:
"Meditation session finished - well done!"
Usa el paquete time para las operaciones de pausa, el paquete strings para separar las cadenas de entrada, el paquete strconv para convertir cadenas a números enteros y el paquete fmt para la salida. Recuerda que time.Sleep recibe un parámetro time.Duration, así que primero convierte el número entero: time.Duration(duration) * time.Millisecond. Un temporizador real usaría time.Second, pero las pausas de segundos enteros hacen que se agote el tiempo de espera de las comprobaciones. Este desafío muestra cómo usar time.Sleep para crear pausas cronometradas durante la ejecución del programa en aplicaciones prácticas, como temporizadores para meditación guiada o ejercicio.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Lee la entrada usando bufio.Scanner para manejar correctamente los espacios
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Analiza los pasos y ciclos de meditación
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Escribe tu código a continuación
// Analiza cada paso para extraer la instrucción y la duración
// Recuerda comprobar que el slice parts tenga suficientes elementos antes de acceder a ellos
// Muestra el encabezado de la sesión y la configuración
// Recorre los ciclos y los pasos
// Usa time.Sleep para las pausas: time.Duration(duration) * time.Millisecond
// Muestra los mensajes de finalización y el resumen
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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