go usando time e canais

Como usar o pacote time e canais para executar uma tarefa a cada X tempo, e aproveitamos para brincar um pouco com o terminal.

Pacote time

Eu sou o primeiro a torcer o nariz para o pacote time, principalmente pela maneira como a formatação de datas é feita, mas um recurso muito interessante é poder criar um canal que retorna a cada X tempo e assim podemos executar ações periódicas.

Veja como isso é feito

Primeiro criamos um canal que vai retornar a cada X tempo, no caso do exemplo 300 milissegundos.

timer := time.Tick(time.Duration(300) * time.Millisecond)

Então basta consumir o canal dentro de um loop como no exemplo abaixo.

for {
	<-timer
	// faz alguma coisa periodicamente aqui
}

E pronto, é só isso.

Vamos ver um exemplo um pouco mais sofisticado e completo.

package main

import (
	"fmt"
	"os"
	"os/signal"
	"time"
)

func main() {

	go func() {
		sc := make(chan os.Signal, 1)
		signal.Notify(sc, os.Interrupt)
		<-sc

		fmt.Println("\nfim!")
		fmt.Print("\033[?25h")
		os.Exit(0)
	}()

	fmt.Print("\033[?25l")

	timer := time.Tick(time.Duration(300) * time.Millisecond)

	s := []rune(`◐◓◑◒`)
	i := 0
	for {
		<-timer
		fmt.Print("\r")
		fmt.Print(string(s[i]))

		i++
		if i == len(s) {
			i = 0
		}
	}
}

Eu expliquei o tratamento de sinais e um modo de usar time para fazer um loop esperar mas o exemplo desse artigo usando canais esta muito mais com a cara do Go.

Aqui tem uma versão bem simplificada para rodar no Go Playground

comments powered by Disqus