Golang: GOPATH e Go Modules (Parte - 2)

Golang

Já instalei e configurei o Go no VS Code. Se você ainda não fez isso, é só acessar o site oficial e seguir o guia: text. Depois de instalar, é importante entender como o Go organiza o código e gerencia as dependências.

GOPATH

O GOPATH foi o primeiro jeito que o Go usou para organizar projetos e gerenciar dependências. Basicamente, ele é uma pasta principal onde ficam todos os seus códigos e as bibliotecas que você usa.

Se você rodar o comando go env no terminal, vai ver várias variáveis de ambiente, incluindo o GOPATH. É nesse diretório que o Go procura pacotes e onde você deveria colocar seus projetos.

Exemplo do comando go env

Outra pasta importante que aparece no comando é a GOMODCACHE. É lá que o Go guarda os módulos que você baixa. Isso evita que você precise baixar as mesmas dependências toda vez que compila o código.

Dentro do GOPATH, você vai encontrar três pastas principais:

  • src: Onde ficam os códigos-fonte dos seus projetos e das dependências.
  • pkg: Onde o Go armazena os arquivos compilados dos pacotes.
  • bin: Onde ficam os binários gerados pelo comando go install.

Apesar de funcionar, essa estrutura tinha algumas limitações:

  • Você era obrigado a seguir uma estrutura de diretórios específica.
  • Era complicado gerenciar várias versões de dependências.
  • Não dava para criar projetos fora do GOPATH.

Go Modules

Antes do Go Modules, o Go não tinha um sistema de controle de versões como o node_modules no JavaScript ou o pip no Python. Isso mudou com o Go 1.11, quando os módulos foram introduzidos, e a partir do Go 1.13 eles se tornaram o padrão.

Com o Go Modules, você pode criar projetos em qualquer pasta, sem depender do GOPATH. Ele usa um arquivo chamado go.mod para listar as dependências do projeto e suas versões. Esse arquivo é criado automaticamente quando você inicializa um módulo com o comando:

go mod init <nome_do_modulo>

Por exemplo, se você rodar go mod init app, o arquivo go.mod vai ficar assim:

module app
go 1.24.1

Se precisar de uma dependência externa, como o framework web github.com/gin-gonic/gin, basta rodar:

go get -u github.com/gin-gonic/gin

O -u serve para atualizar o pacote e suas dependências para as versões mais recentes. Sem ele, o Go só instala o pacote sem mexer nas dependências já existentes.

Ah, e uma coisa importante: a partir do Go 1.17, o comando go get não é mais usado para instalar binários. Agora, ele serve apenas para gerenciar dependências no go.mod. Para instalar binários, o comando recomendado é o go install.

Quando você instala uma dependência, o Go cria ou atualiza dois arquivos:

  • go.mod: Lista as dependências do projeto.
  • go.sum: Garante que as versões das dependências sejam sempre as mesmas, mesmo que algo mude no repositório original.

Alguns comandos úteis para trabalhar com módulos:

  • go mod tidy: Remove dependências que não estão sendo usadas e atualiza o go.mod e o go.sum.
  • go mod download: Faz o download das dependências para o cache local, mas não as instala.
  • go mod graph: Mostra como as dependências estão conectadas.
  • go mod verify: Verifica se as dependências estão corretas e se os hashes no go.sum batem com os arquivos baixados.
  • go mod edit: Permite editar o go.mod manualmente.
  • go mod list -m: Lista as dependências do módulo com detalhes.
  • go mod vendor: Cria uma cópia local das dependências no diretório vendor, útil para trabalhar offline.

Com os módulos, o gerenciamento de dependências no Go ficou muito mais simples e flexível.

Referências