Instalando Go e entendendo o workspace
1. Instalação do Go no seu sistema operacional
O primeiro passo para começar com Go é instalar o compilador e as ferramentas necessárias. Acesse o site oficial go.dev/dl e baixe o instalador adequado para seu sistema operacional.
Windows: Execute o instalador MSI e siga o assistente. O Go será instalado em C:\Go por padrão, e o PATH será configurado automaticamente.
macOS: Use o pacote .pkg ou, alternativamente, instale via Homebrew:
brew install go
Linux: Baixe o arquivo .tar.gz e extraia em /usr/local:
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz
Após a instalação, verifique se tudo funcionou corretamente:
go version
Você deverá ver algo como go version go1.21.5 linux/amd64.
2. Configurando variáveis de ambiente essenciais
O Go depende de algumas variáveis de ambiente para funcionar corretamente. As principais são:
GOROOT: Aponta para o diretório onde o Go foi instalado. Geralmente é configurado automaticamente, mas você pode defini-lo manualmente:
export GOROOT=/usr/local/go
GOPATH: Define o diretório de trabalho do Go. Por padrão, é $HOME/go. Você pode alterá-lo:
export GOPATH=$HOME/go
PATH: Deve incluir tanto o diretório do compilador quanto o diretório de binários:
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
GOBIN: Opcionalmente, define onde os binários compilados serão armazenados:
export GOBIN=$GOPATH/bin
Para tornar essas configurações permanentes, adicione-as ao arquivo ~/.bashrc, ~/.zshrc ou equivalente.
3. Estrutura do workspace tradicional (GOPATH mode)
Antes dos módulos (Go Modules), todo projeto Go precisava seguir uma estrutura rígida dentro do GOPATH. O workspace clássico possui três diretórios principais:
$GOPATH/
├── src/ # Código-fonte dos projetos
├── pkg/ # Pacotes compilados e bibliotecas
└── bin/ # Executáveis gerados
src: Cada projeto fica em $GOPATH/src/nome-do-projeto. Por exemplo, um projeto chamado meuapp estaria em $GOPATH/src/meuapp.
pkg: Armazena pacotes compilados em formato .a, organizados por arquitetura e sistema operacional.
bin: Contém os executáveis gerados pelo comando go install.
Exemplo de estrutura de projeto no modo GOPATH:
// $GOPATH/src/meuapp/main.go
package main
import "fmt"
func main() {
fmt.Println("Olá, Go!")
}
Para compilar e instalar:
cd $GOPATH/src/meuapp
go install
O binário será gerado em $GOPATH/bin/meuapp.
4. Entendendo o módulo Go (Go Modules)
A partir do Go 1.11, os módulos (Go Modules) foram introduzidos para resolver limitações do GOPATH puro, como a impossibilidade de versionar dependências e a rigidez da estrutura de diretórios.
Para iniciar um novo módulo:
mkdir meu-modulo
cd meu-modulo
go mod init github.com/seuusuario/meu-modulo
Isso cria um arquivo go.mod com o seguinte conteúdo:
module github.com/seuusuario/meu-modulo
go 1.21
O go.mod é o coração do módulo. Ele identifica o módulo, especifica a versão do Go e lista as dependências externas. Quando você importa um pacote externo e executa go mod tidy, o arquivo é atualizado automaticamente.
Exemplo prático:
// main.go
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Go())
}
go mod tidy
O go.mod será atualizado para incluir rsc.io/quote e seu go.sum será criado para verificar a integridade das dependências.
5. Organizando pacotes dentro do workspace
Com Go Modules, você pode organizar seu código em pacotes dentro do mesmo módulo. Cada pacote é um diretório contendo arquivos .go com a mesma declaração package.
Estrutura de exemplo:
meu-modulo/
├── main.go
├── go.mod
├── go.sum
└── utils/
└── math.go
// utils/math.go
package utils
// Soma retorna a soma de dois inteiros
func Soma(a, b int) int {
return a + b
}
// main.go
package main
import (
"fmt"
"github.com/seuusuario/meu-modulo/utils"
)
func main() {
resultado := utils.Soma(10, 20)
fmt.Println("Resultado:", resultado)
}
Regras de visibilidade: Identificadores que começam com letra maiúscula são exportados (públicos). Identificadores com letra minúscula são privados ao pacote.
// utils/math.go
package utils
// Soma é exportado (maiúsculo)
func Soma(a, b int) int {
return a + b
}
// subtrai é privado (minúsculo)
func subtrai(a, b int) int {
return a - b
}
6. Ferramentas essenciais do ecossistema Go
O Go vem com ferramentas poderosas que facilitam o desenvolvimento:
go build: Compila o projeto e gera um binário executável:
go build -o meuapp
go run: Compila e executa o código sem gerar um binário permanente:
go run main.go
go fmt: Formata automaticamente o código seguindo o padrão oficial:
go fmt ./...
go vet: Analisa o código em busca de suspeitas de erros:
go vet ./...
go test: Executa testes unitários:
go test ./...
Exemplo de uso prático com um projeto:
# Desenvolvimento rápido
go run main.go
# Preparando para produção
go build -o meuapp .
./meuapp
# Mantendo qualidade
go fmt ./...
go vet ./...
7. Dicas práticas e resolução de problemas comuns
Erro: "go: command not found"
Verifique se o PATH está configurado corretamente:
export PATH=$PATH:/usr/local/go/bin
Erro: "cannot find package"
Certifique-se de que está usando módulos e que o go.mod está presente. Execute go mod tidy para baixar dependências.
Gerenciando múltiplos módulos
Você pode usar o replace no go.mod para trabalhar com módulos locais:
module github.com/meuapp
go 1.21
require github.com/minhalib v0.0.0
replace github.com/minhalib => ../minhalib
Diagnosticando configurações
Use go env para ver todas as variáveis de ambiente:
go env GOPATH GOROOT GOBIN
Problema comum: versão do Go desatualizada
Sempre verifique a versão mais recente e atualize regularmente:
go version
# Se necessário, baixe a nova versão em go.dev/dl
Dica de organização: Mesmo com módulos, mantenha projetos em $GOPATH/src para evitar confusão com ferramentas antigas.
Referências
- Documentação oficial de instalação do Go — Guia passo a passo para instalar Go em diferentes sistemas operacionais
- Como escrever código Go (oficial) — Explicação detalhada sobre workspace, GOPATH e módulos
- Tutorial de Go Modules — Artigo oficial sobre como usar módulos no Go
- Gerenciando dependências com Go — Guia oficial sobre dependências e go.mod
- Effective Go — Guia de boas práticas de programação em Go, incluindo organização de pacotes
- Go by Example: Modules — Exemplos práticos de como criar e usar módulos Go