Recapitulação - Timer Simples
Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 65 de 68.
Desafio
FácilCrie uma aplicação de cronômetro regressivo que use time.NewTicker para fazer a contagem regressiva de uma duração especificada até zero, exibindo mensagens de progresso em intervalos regulares. Este desafio testará sua capacidade de combinar tickers, loops e cálculos de duração para criar uma aplicação funcional de temporização.
Você receberá duas entradas:
- Uma string contendo a duração da contagem regressiva no formato
"value:unit"(por exemplo,"10:Second"ou"3:Minute") - Uma string contendo o intervalo de atualização no formato
"value:unit"(por exemplo,"1:Second")
Sua tarefa é:
- Analisar a primeira entrada dividindo-a nos dois-pontos para extrair o valor e a unidade da duração da contagem regressiva
- Analisar a segunda entrada dividindo-a nos dois-pontos para extrair o valor e a unidade do intervalo de atualização
- Converter os valores de string em inteiros usando o pacote
strconv - Criar objetos
time.Durationpara a duração da contagem regressiva e o intervalo de atualização usando as constantes apropriadas:- Para
"Second": multiplicar portime.Second - Para
"Minute": multiplicar portime.Minute - Para
"Hour": multiplicar portime.Hour
- Para
- Exibir o cabeçalho do cronômetro:
"=== COUNTDOWN TIMER ===" - Exibir a configuração do cronômetro:
"Starting countdown from [countdown_duration_object]" - Exibir a frequência de atualização:
"Updates every [update_interval_object]" - Criar um ticker usando
time.NewTickercom a duração do intervalo de atualização - Inicializar uma variável de tempo restante com a duração da contagem regressiva
- Usar um loop para fazer a contagem regressiva:
- Aguardar cada evento do ticker usando
<-ticker.C - Subtrair o intervalo de atualização do tempo restante
- Se o tempo restante for maior que 0, exibir:
"Time remaining: [remaining_time_object]" - Se o tempo restante for 0 ou menor, exibir:
"Time's up!"e sair do loop
- Aguardar cada evento do ticker usando
- Parar o ticker usando
ticker.Stop() - Exibir as estatísticas de conclusão:
"=== TIMER COMPLETE ===""Original duration: [countdown_duration_object]""Update interval: [update_interval_object]""Total updates displayed: [number_of_updates]"(calcular quantas vezes o tempo restante foi exibido)
- Exibir a mensagem de conclusão:
"Countdown timer finished successfully"
Use o pacote time para operações com ticker e duração, o pacote strings para dividir strings de entrada, o pacote strconv para converter strings em inteiros e o pacote fmt para a saída. Lembre-se de que time.NewTicker retorna um ticker que envia valores pelo seu canal em intervalos regulares, e você deve chamar ticker.Stop() quando terminar para liberar recursos. Este desafio demonstra como criar um cronômetro regressivo prático usando os mecanismos de temporização do Go.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Ler entrada
var countdownInput string
var intervalInput string
fmt.Scanln(&countdownInput)
fmt.Scanln(&intervalInput)
// Analisar a entrada da duração da contagem regressiva
countdownParts := strings.Split(countdownInput, ":")
countdownValue, _ := strconv.Atoi(countdownParts[0])
countdownUnit := countdownParts[1]
// Analisar a entrada do intervalo de atualização
intervalParts := strings.Split(intervalInput, ":")
intervalValue, _ := strconv.Atoi(intervalParts[0])
intervalUnit := intervalParts[1]
// TODO: Escreva seu código abaixo
// Converter para objetos time.Duration usando instruções switch
// Criar o cronômetro de contagem regressiva (simular sem atrasos reais para testes)
// Implementar o loop de contagem regressiva
// Exibir todas as mensagens e estatísticas necessárias
// Nota: Para fins de teste, simule o comportamento do ticker sem atrasos de tempo reais
}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 Tarefa7Tratamento de Erros em Profundidade
Tipos de Erro PersonalizadosWrapping de Erros com `%w`Unwrapping com `errors.Is`Unwrapping com `errors.As`Entendendo o `panic`Usando o `recover`Recapitulação - Divisão Segura10Trabalhando com Tempo
Obtendo o Horário AtualCriando um Horário EspecíficoFormatando o TempoParsing de Strings de TempoDuração de TempoAritmética de TempoSleep e TickersRecapitulação - Timer Simples2Structs 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 ComportamentosPratique por conta própria: Compilador de Go online