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. O 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 o 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, o time.NewTicker cria um ticker que envia valores em 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 // Wait for the next 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.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilCrie um temporizador de sessão de meditação que use time.Sleep para criar pausas entre instruções guiadas e demonstre o controle básico de tempo em programas Go.
Você receberá duas entradas:
- Uma string contendo os passos da meditação no formato
"step1:duration,step2:duration,step3:duration"(ex:"Breathe in:3,Hold:2,Breathe out:4") - Uma string contendo o número de ciclos a repetir (ex:
"5")
Sua tarefa é:
- Analisar a primeira entrada dividindo-a por vírgulas para obter os passos individuais da meditação
- Para cada passo, dividir por dois pontos para extrair a instrução e a duração (em segundos)
- Converter as strings de duração em inteiros usando o pacote
strconv - Converter a segunda entrada em um inteiro para obter o número de ciclos
- Exibir o cabeçalho da sessão:
"=== MEDITATION TIMER ===" - Exibir a configuração da sessão:
"Starting meditation session with [number_of_cycles] cycles" - Para cada ciclo (começando pelo ciclo 1):
- Exibir:
"--- Cycle [cycle_number] ---" - Para cada passo da meditação:
- Exibir:
"[instruction]..." - Usar
time.Sleeppara pausar pela duração especificada (converta segundos paratime.Durationmultiplicando portime.Second) - Após a pausa, exibir:
"[instruction] complete ([duration] seconds)"
- Exibir:
- Após completar todos os passos de um ciclo, exibir:
"Cycle [cycle_number] finished"
- Exibir:
- Após todos os ciclos serem concluídos, 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"(soma de todas as durações dos passos multiplicada pelo número de ciclos)
- Exibir a mensagem de conclusão:
"Meditation session finished - well done!"
Use o pacote time para operações de pausa, o pacote strings para dividir as strings de entrada, o pacote strconv para converter strings em inteiros e o pacote fmt para a saída. Lembre-se que time.Sleep recebe um parâmetro time.Duration, então você precisa multiplicar seus segundos inteiros por time.Second para criar o valor de duração adequado. Este desafio demonstra como usar time.Sleep para criar pausas cronometradas na execução do programa para aplicações práticas como meditação guiada ou temporizadores de exercícios.
Folha de consulta
Use time.Sleep para pausar a execução do programa por uma duração especificada:
time.Sleep(2 * time.Second)Use time.NewTicker para realizar ações em intervalos regulares:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Aguarda o próximo tick
fmt.Println("Tick", i+1)
}Ambas as funções usam valores time.Duration. Converta inteiros para duração multiplicando por time.Second.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Ler a entrada usando bufio.Scanner para lidar com espaços corretamente
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Analisar as etapas e ciclos de meditação
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Escreva seu código abaixo
// Analisar cada etapa para extrair a instrução e a duração
// Lembre-se de verificar se a fatia (slice) de partes tem elementos suficientes antes de acessar
// Exibir o cabeçalho e a configuração da sessão
// Percorrer os ciclos e etapas
// Usar time.Sleep para pausas (considere usar milissegundos para testes)
// Exibir mensagens de conclusão e resumo
}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
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos