Menu
CoddyTech

Sleep e Tickers

Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 64 de 68.

Às vezes, você precisa controlar o tempo de execução do seu programa. Go fornece duas funções essenciais no pacote time para isso: time.Sleep para pausar a execução e time.NewTicker para realizar ações em intervalos regulares.

A função time.Sleep pausa seu programa por uma duração especificada. Ela recebe um time.Duration como parâmetro e bloqueia a execução até que esse tempo tenha passado:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

Para ações repetidas em intervalos regulares, time.NewTicker cria um ticker que envia valores por um canal em intervalos especificados. Isso é útil para tarefas que precisam ser executadas periodicamente:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // Aguarde o próximo tick
    fmt.Println("Tick", i+1)
}

Essas funções de temporização são essenciais para criar atrasos, implementar timeouts e agendar operações recorrentes em seus programas Go.

challenge icon

Desafio

Fácil

Crie um temporizador de sessão de meditação que use time.Sleep para criar pausas entre instruções guiadas e demonstrar o controle básico de tempo em programas Go.

Você receberá duas entradas:

  • Uma string contendo etapas de meditação no formato "step1:duration,step2:duration,step3:duration" (por exemplo, "Breathe in:3,Hold:2,Breathe out:4")
  • Uma string contendo o número de ciclos a repetir (por exemplo, "5")

Sua tarefa é:

  1. Analisar a primeira entrada separando-a por vírgulas para obter as etapas individuais de meditação
  2. Para cada etapa, separar por dois-pontos para extrair a instrução e a duração (em segundos)
  3. Converter as strings de duração em inteiros usando o pacote strconv
  4. Converter a segunda entrada em um inteiro para obter o número de ciclos
  5. Exibir o cabeçalho da sessão: "=== MEDITATION TIMER ==="
  6. Exibir a configuração da sessão: "Starting meditation session with [number_of_cycles] cycles"
  7. Para cada ciclo (começando pelo ciclo 1):
    • Exibir: "--- Cycle [cycle_number] ---"
    • Para cada etapa da meditação:
      • Exibir: "[instruction]..."
      • Usar time.Sleep para pausar pela duração especificada (multiplique a duração por time.Millisecond, como em time.Duration(duration) * time.Millisecond, para que as verificações terminem rapidamente; a saída ainda informa segundos)
      • Após a pausa, exibir: "[instruction] complete ([duration] seconds)"
    • Após concluir todas as etapas de um ciclo, exibir: "Cycle [cycle_number] finished"
  8. Após concluir todos os ciclos, exibir o resumo da sessão:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (a soma das durações de todas as etapas multiplicada pelo número de ciclos)
  9. Exibir a mensagem de conclusão: "Meditation session finished - well done!"

Use o pacote time para as operações de pausa, o pacote strings para separar as strings de entrada, o pacote strconv para converter strings em inteiros e o pacote fmt para a saída. Lembre-se de que time.Sleep recebe um parâmetro time.Duration, então converta primeiro o inteiro: time.Duration(duration) * time.Millisecond. Um temporizador real usaria time.Second, mas pausas de segundos inteiros fazem com que as verificações atinjam o tempo limite. Este desafio demonstra como usar time.Sleep para criar pausas cronometradas na execução do programa em aplicações práticas, como temporizadores de meditação guiada ou de exercícios.

Experimente você mesmo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Leia a entrada usando bufio.Scanner para lidar corretamente com os espaços
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// Analise as etapas e os ciclos da meditação
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Escreva seu código abaixo
	// Analise cada etapa para extrair a instrução e a duração
	// Lembre-se de verificar se o slice parts tem elementos suficientes antes de acessá-los
	// Exiba o cabeçalho e as configurações da sessão
	// Percorra os ciclos e as etapas
	// Use time.Sleep para as pausas: time.Duration(duration) * time.Millisecond
	// Exiba as mensagens de conclusão e o resumo
	
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo

Pratique por conta própria: Compilador de Go online