go usando time e canais
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 o vídeo desse arquivo aqui.
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 Golang Playground