Setup do ambiente de desenvolvimento Go

Neste post mostro como fazer o setup do seu ambiente de desenvolvimento Go. Além disso mostro como criar um simples projeto Go utilizando go modules.

Neste post vamos falar sobre o setup do seu ambiente de desenvolvimento. Primeiramente a IDE.
Eu particularmente uso e recomendo que você também use o Visual Studio Code (VSCode) da Microsoft. É uma IDE poderosa e gratuita. Faça o download em https://code.visualstudio.com/.
Outra excelente opção de IDE para o Go é o Golandhttps://www.jetbrains.com/pt-br/go/. Ele é feito pela tradicional JetBrains e é uma IDE especifica para Go, sendo assim considerado por muitos a melhor IDE para Go do mercado. Mas tem um porém, ela não é free, e nem é barata. Você precisa pagar uma assinatura anual em torno de 200 dólares por ano, ou seja, em março de 2023, fazendo a conversão, estamos falando em mais de 1000 reais por ano pra usar uma IDE. Digo e repito: Vá de VSCode sem medo.

Feito download e instalado o VSCode, agora você vai instalar alguns plugins ou extensões necessários pra facilitar sua vida quando estiver trabalhando com Go.

1 – Já com o VSCode aberto digite CMD+SHIFT+X no Mac ou CTRL+SHIFT+X no Windows/Linux para abrir a barra de extensões do VSCode, ou vá no Menu superior: View -> Extensions. Eu acho bacana você se familiarizar e memorizar os atalhos de teclado, facilita e agiliza muito nosso trabalho. Seguindo, na barra de pesquisas de extensões digite Go e dê enter. A primeira extensão do topo é a que queremos, com o badge azul. Clique em instalar.

Extensão Go

2 – Agora, digite outro atalho de teclado: CMD+SHIFT+P no Mac ou CTRL+SHIFT+P no Windows/Linux. Você vai abrir a paleta de comandos. Digite: Go: Install/Update tools. Você verá uma lista com várias ferramentas. Cheque todas e clique em OK.

Go Tools VSCode

Maravilha, isso é tudo que precisamos pra começar a codar em Go. Existem outras centenas de extensões, fique a vontade para explorar e experimentar, porém esse é o setup essencial do VSCode e já resolve 99% dos casos.

Um pouco de história agora que eu acho legal você conhecer, digo o porquê depois.

Nos primórdios do Go, até a versão 1.10 isso ainda não era suficiente.
Para começar a trabalhar com Go, além da instalação você precisava fazer outras coisas. Você precisava setar manualmente duas variáveis de ambiente: GOPATH e GOROOT. GOPATH se refere ao caminho do workspace de desenvolvimento. Por exemplo, vamos supor que você criou um ambiente de desenvolvimento (como eu fiz durante muitos anos) dentro de /Users/nomedocomputador/work. Dentro da pasta work criei uma pasta chamada go onde todos os meus projetos em Go ficariam. Sendo assim o GOPATH deveria ser setado como GOPATH=/Users/nomedocomputador/work/go.
O GOROOT é o caminho onde estaria a sua instalaçao do go, por exemplo /usr/local/bin. Isso também deveria ser setado manualmente como GOROOT=/usr/local/bin
Feito isso, você deveria criar dentro do GOPATH um sistema bem específico de diretórios contendo as pastas src, bin e packages. Dentro de src, em uma uma árvore de diretórios baseada em repositórios é onde seu código viveria. Veja a imagem para entender melhor.

Sistema de Diretórios Go

Toda essa estrutura era necessária para que o Go fizesse o correto gerenciamento de dependências. Por exemplo, para usar uma lib externa você roda o comando go get github.com/gorilla/muxna raiz do seu projeto. O Go faz o download desse pacote e coloca ele dentro da estrutura GOPATH/src/github.com/gorilla/mux. Quando você importasse esse pacote no seu código, o Go já saberia resolver o caminho e tudo funcionaria. Porém se você tentasse criar um projeto fora do GOPATH, o Go já não saberia mais como importar e encontrar essas libs externas. Alguns workarounds existem pra fazer isso funcionar mas mesmo assim, muito trabalho.

Dito tudo isso, a partir da versão 1.11 o go introduziu uma nova feature chamada modules. Até então opcional, e a partir da versão 1.12 habilitada por padrão.
Com o go modules nosso trabalho foi extremamente facilitado e simplificado. Você já não precisa mais setar GOPATH nem GOROOT, basta instalar o Go como expliquei no último post e tudo está funcionando.
Você também já não precisa ter aquela árvore de diretórios baseada em repositórios. Você pode criar um projeto Go em qualquer lugar da sua máquina. Apenas alguns comandos: go mod init, go mod tidy, go get e go mod vendor (opcional) são tudo que você precisa.

Agora, voltando a razão de o porquê que é bom você saber de tudo isso sendo que já que não é mais necessário.
Ao procurar por tutoriais e posts de Go pela net, você vai se deparar com todo tipo coisa. Muitos tutoriais antigos vão te ensinar a criar seu ambiente usando o GOPATH e GOROOT como expliquei acima. Muitos tutoriais NOVOS vão te ensinar a criar seu ambiente usando o GOPATH e GOROOT. Muitos outros já vão te ensinar a criar usando go modules. E ainda o pior, muitos tutoriais vão te ensinar a criar seu ambiente de desenvolvimento usando os dois métodos misturados, o que pode te levar para um rabbit hole de inconsistências e erros no seu ambiente. Isso tudo gera muita confusão sobre como as coisas deveriam ser feitas. Agora você já está melhor situado quando se deparar com tais situações. Sempre use go modules.

Vamos aprender a criar um projeto em Go:

Crie uma pasta chamada teste-go
Pelo terminal/linha de comando, acesse essa pasta e dê o comando go mod init teste-go

cd $HOME/work
mkdir teste-go
cd teste-go
go mod init teste-go

Você perceberá que esse comando cria um novo arquivo na raiz do projeto chamado go.mod. Nesse arquivo ficam listadas todas as dependências do seu projeto bem como a versão de cada uma.

Crie um arquivo main.go
Abra main.go no VSCode e digite:

package main

import "fmt"

func main() {
    fmt.Println("Hello Go")
}

De volta ao terminal/linha de comando, digite:

go run main.go

Até aqui tudo ok, você deve ter visto a saída “Hello Go” no terminal/linha de comando.
Ainda no terminal/linha de comando, agora vamos importar uma lib externa usando go get. Pra esse exemplo vou usar o popular Gorilla/Mux:

go get github.com/gorilla/mux

Gorilla Mux é um framework popular que facilita entre outras coisas a criação de api’s em Go. Infelizmente o projeto foi arquivado em dezembro de 2022 e não terá mais continuidade, de acordo com seu criador (https://github.com/gorilla#gorilla-toolkit).
Vamos importar e utilizar a lib no projeto:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HelloGo)
    http.ListenAndServe(":8080", r)
}

func HelloGo(w http.ResponseWriter, rq *http.Request) {
    fmt.Fprintf(w, "Hello Go!\n")
}

De volta ao terminal/linha de comando rode novamente:

go run main.go

Você verá que nosso import funcionou sem maiores problemas. Você agora já tem um servidor web funcional rodando e ouvindo na porta 8080. Abra seu browser em http://localhost:8080 e você deverá ver a mensagem Hello Go.

Outro comando interessante é go mod tidy. Você usa esse comando, por exemplo, se você copiou um trecho de código de outro programa que traz imports de libs externas. Sem que você precise dar um go get em todas as libs listadas, basta você ir no terminal e digitar:

go mod tidy

Esse utilitário varre o seu código, importa todas as libs pra você e atualiza o seu arquivo go.mod com as libs importadas (e também elimina do arquivo as libs não usadas).

Outro comando disponível para você é o:

go mod vendor

Esse comando irá criar uma pasta chamada vendor na raiz do seu projeto e vai colocar todas as dependências externas lá dentro. Isso seria semelhante a pasta node_modules em um projeto Node.js, por exemplo. Ter as dependências locais é útil em casos, por exemplo, onde você pode querer compilar seu projeto em uma máquina sem internet , de outra forma o build teria que fazer o download das dependências pra inserir no seu programa. Ou então, por exemplo, módulos podem ser apagados a qualquer momento (acabamos de ver o caso do Gorilla Mux que foi arquivado, quem não garante que será deletado pra sempre?). Se você gosta e usa muito aquele módulo, uma cópia local garante que você nunca terá problemas se ele desaparecer da internet.

Vou encerrando esse post aqui. No próximo quero dar mais dicas de setup usando o VSCode, pois muitas coisas podem ser confusas no início e também quero compartilhar algumas dicas que eu mesmo uso no meu dia-a-dia.
Nos vemos lá!

1 comment
Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Post Anterior

Instalando Go

Próximo Post

Trabalhando com Go no VS Code

Posts Relacionados

Concorrência em Go com Goroutines

Descubra o poder das goroutines em Go para concorrência eficiente. Aprenda canais, select e tratamento de erros, além das diferenças com threads. Torne seus programas mais escaláveis e eficazes.
Leia Mais