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 esto: 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 una duración especificada. Toma un time.Duration como su 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 acciones repetidas a intervalos regulares, time.NewTicker crea un ticker que envía valores en un canal a intervalos especificados. Esto es útil para tareas que necesitan ejecutarse periódicamente:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Esperar 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.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilCrea un temporizador de sesión de meditación que utilice time.Sleep para crear pausas entre las instrucciones guiadas y demuestre el control básico de temporización en programas de Go.
Recibirás dos entradas:
- Una cadena que contiene los pasos de meditación en el formato
"step1:duration,step2:duration,step3:duration"(por ejemplo,"Breathe in:3,Hold:2,Breathe out:4") - Una cadena que contiene el número de ciclos a repetir (por ejemplo,
"5")
Tu tarea es:
- Analizar la primera entrada dividiéndola por comas para obtener los pasos de meditación individuales
- Para cada paso, dividir por dos puntos para extraer la instrucción y la duración (en segundos)
- Convertir las cadenas de duración a enteros utilizando el paquete
strconv - Convertir la segunda entrada a un 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 (comenzando desde el ciclo 1):
- Mostrar:
"--- Cycle [cycle_number] ---" - Para cada paso de meditación:
- Mostrar:
"[instruction]..." - Usar
time.Sleeppara pausar durante la duración especificada (convierte los segundos atime.Durationmultiplicándolos portime.Second) - 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:
- Después de completar 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"(suma de todas las duraciones de los pasos multiplicada por el número de ciclos)
- Mostrar el mensaje de finalización:
"Meditation session finished - well done!"
Utiliza el paquete time para las operaciones de pausa, el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a enteros y el paquete fmt para la salida. Recuerda que time.Sleep recibe un parámetro time.Duration, por lo que necesitas multiplicar tus segundos enteros por time.Second para crear el valor de duración adecuado. Este desafío demuestra cómo usar time.Sleep para crear pausas temporizadas en la ejecución de un programa para aplicaciones prácticas como meditación guiada o temporizadores de ejercicio.
Hoja de referencia
Usa time.Sleep para pausar la ejecución del programa durante una duración específica:
time.Sleep(2 * time.Second)Usa time.NewTicker para realizar acciones a intervalos regulares:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Esperar al siguiente tick
fmt.Println("Tick", i+1)
}Ambas funciones usan valores time.Duration. Convierte enteros a duración multiplicándolos por time.Second.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Leer la entrada usando bufio.Scanner para manejar los espacios correctamente
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Analizar los pasos y ciclos de meditación
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Escribe tu código a continuación
// Analizar cada paso para extraer la instrucción y la duración
// Recuerda verificar si el slice de partes tiene suficientes elementos antes de acceder
// Mostrar el encabezado y la configuración de la sesión
// Iterar a través de los ciclos y pasos
// Usar time.Sleep para las pausas (considera usar milisegundos para las pruebas)
// Mostrar 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 comportamientos