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

Cesar Gimenes

Última modificação