Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Crea 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:

  1. Analizar la primera entrada separándola por comas para obtener los pasos de meditación individuales
  2. Para cada paso, separarlo por dos puntos para extraer la instrucción y la duración (en segundos)
  3. Convertir las cadenas de duración a números enteros usando el paquete strconv
  4. Convertir la segunda entrada a un número entero para obtener el número de ciclos
  5. Mostrar el encabezado de la sesión: "=== MEDITATION TIMER ==="
  6. Mostrar la configuración de la sesión: "Starting meditation session with [number_of_cycles] cycles"
  7. Para cada ciclo (empezando por el ciclo 1):
    • Mostrar: "--- Cycle [cycle_number] ---"
    • Para cada paso de meditación:
      • Mostrar: "[instruction]..."
      • Usar time.Sleep para pausar durante la duración especificada (multiplicar la duración por time.Millisecond, como en time.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)"
    • Después de completar todos los pasos de un ciclo, mostrar: "Cycle [cycle_number] finished"
  8. 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)
  9. 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
	
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Go online