Se você se sente incomodado em ter que parar sua aplicação e fazer go run
novamente toda vez que faz uma alteração, esse post vai melhorar sua vida… e MUITO.
Nesse post vou te mostrar como fazer live reload de aplicações Go utilizando uma ferramenta open source chamada Air (https://github.com/cosmtrek/air).
Para testar as funcionalidades da ferramenta, vamos escrever um pequeno programa que retorna um “Olá mundo”.
Vamos inicializar um novo módulo com o comando go mod init github.com/aprendagolang/live-reload
e criar um arquivo main.go com o seguinte conteúdo.
package main import ( "net/http" "github.com/go-chi/chi/v5" ) func main() { r := chi.NewRouter() r.Get("/", func(rw http.ResponseWriter, r *http.Request) { rw.Write([]byte("Olá Mundo")) }) http.ListenAndServe(":8080", r) }
Como estamos utilizando uma dependência externa, vamos executar o go mod tidy
para atualizar nosso go.mod, que deve ficar parecido com isso:
module github.com/aprendagolang/live-reload go 1.18 require github.com/go-chi/chi/v5 v5.0.7
Com nosso pequeno programa escrito, vamos instalar o Air.
Por ser escrito em Go, podemos fazer sua instalação utilizando o próprio install
do Go.
go install github.com/cosmtrek/air@latest
Para testar se deu tudo certo com a instalação, execute um air -v
no seu terminal. Se a instação ocorreu sem problemas, você deverá ver o seguinte output:

Agora vamos criar um arquivo de configuração para o Air com o comando air init
. Esse comando irá criar um arquivo chamado .air.toml
com o seguinte conteúdo.
root = "." testdata_dir = "testdata" tmp_dir = "tmp" [build] args_bin = [] bin = "./tmp/main" cmd = "go build -o ./tmp/main ." delay = 1000 exclude_dir = ["assets", "tmp", "vendor", "testdata"] exclude_file = [] exclude_regex = ["_test.go"] exclude_unchanged = false follow_symlink = false full_bin = "" include_dir = [] include_ext = ["go", "tpl", "tmpl", "html"] kill_delay = "0s" log = "build-errors.log" send_interrupt = false stop_on_error = true [color] app = "" build = "yellow" main = "magenta" runner = "green" watcher = "cyan" [log] time = false [misc] clean_on_exit = false [screen] clear_on_rebuild = false
Uma pequena mudança que eu gosto de fazer é mudar o time para true. Porém se você não quiser, não precisa alterar nada nesse arquivo.
Agora tudo que precisamos fazer é executar o comando air
no terminal e nosso live reload já estará funcionando.

Para testar o live reload, vamos modificar o nosso r.Get("/", ...
para o seguinte:
r.Get("/{name}", func(rw http.ResponseWriter, r *http.Request) { name := chi.URLParam(r, "name") rw.Header().Add("Content-Type", "application/json") json.NewEncoder(rw).Encode(map[string]string{ "message": fmt.Sprintf("Olá %s!!!", name), }) })
Como podemos ver no terminal, a aplicação foi recompilada automaticamente.

É isso, espero que essa dica ajude a melhorar sua produtividade.
Deixem suas dúvidas nos comentários.
Até a próxima!