Go Módulos Intermediário
Pacotes e módulos
Em Go, pacotes são a unidade básica de organização do código. Todo arquivo .go pertence a um pacote, declarado na primeira linha com package nome. Isso permite agrupar funções, tipos e variáveis relacionadas, além de controlar o que é visível fora do pacote: identificadores que começam com letra maiúscula são exportados (públicos), enquanto os que começam com minúscula são privados ao pacote.
Para gerenciar dependências e versões, Go usa módulos, definidos pelo arquivo go.mod. Um módulo é uma coleção de pacotes versionados juntos. O comando go mod init exemplo.com/meumodulo cria o go.mod com o nome do módulo e a versão do Go. A partir daí, imports internos usam esse caminho como prefixo.
A organização de pastas segue a estrutura de diretórios: cada pasta é um pacote, e o nome do pacote geralmente coincide com o nome da pasta. O compilador Go trata subdiretórios como pacotes separados. Já o diretório especial internal restringe o acesso: pacotes dentro de internal só podem ser importados por código que esteja na árvore de diretórios acima dele.
Neste card, vamos criar um módulo com múltiplos pacotes, incluindo um pacote internal, e demonstrar como a exportação por maiúscula e a estrutura de pastas funcionam na prática.
Pontos-chave
- Todo arquivo Go pertence a um pacote, declarado com
package nome. - Identificadores com inicial maiúscula são exportados (públicos); com minúscula, privados ao pacote.
- O arquivo
go.moddefine o módulo e suas dependências; é criado comgo mod init. - Cada diretório é um pacote separado; o nome do pacote deve coincidir com o nome da pasta (exceto
main). - O diretório
internalrestringe imports: só pode ser usado por pacotes na mesma árvore de diretórios.
// main.go
package main
import (
"fmt"
"meumodulo/internal/saudacao"
"meumodulo/matematica"
)
func main() {
// Usa função exportada do pacote matematica
soma := matematica.Somar(3, 4)
fmt.Println("Soma:", soma)
// Usa função exportada do pacote internal/saudacao
msg := saudacao.Ola("Go")
fmt.Println(msg)
// Tentar acessar matematica.dobro (minúsculo) causaria erro de compilação
// fmt.Println(matematica.dobro(5)) // descomente para ver o erro
}