Nomenclatura de Pacotes e Diretórios internal/
Nomes de pacotes e layout de diretórios Go comunicam a intenção antes que um leitor abra um arquivo.
Busque em todas as páginas da documentação
Nomes de pacotes e layout de diretórios Go comunicam a intenção antes que um leitor abra um arquivo.
Nomes curtos e consistentes, mais diretórios internal/, mantêm as APIs públicas honestas e permitem que o compilador imponha limites.
Nomes de pacotes devem ser em minúsculas, concisos e descritivos, sem repetição redundante.
Caminhos de importação carregam o prefixo do módulo; cláusulas de pacote nomeiam a unidade compilada.
O nome especial internal restringe importações a diretórios ancestrais dentro da mesma árvore de módulos.
Essa combinação reduz o acoplamento acidental e torna os refators mais seguros para autores de bibliotecas.
Cartão de receita de referência rápida - pronto para copiar e colar.
// example.com/widget/internal/parser/parser.go
package parser // não package widgetparser
import "strings"
func Parse(raw string) (string, error) {
return strings.TrimSpace(raw), nil
}// example.com/widget/api/handler.go
package api
import "example.com/widget/internal/parser"
func Handle(raw string) (string, error) {
return parser.Parse(raw)
}Quando usar isso:
auth, store, parser), não no nome do repositório.internal/ quando módulos externos não devem importá-los.cmd/ de pacotes reutilizáveis no mesmo módulo.go list ou linters que sinalizam caminhos repetitivos.example.com/checkout/
go.mod
cmd/checkoutd/main.go
checkout/ // tipos de domínio - o caminho de importação termina em /checkout
checkout.go
internal/
tax/
tax.go
payment/
payment.go
api/
http.go
// checkout/checkout.go
package checkout
type Cart struct {
Items []string
}// internal/tax/tax.go
package tax
func Rate(region string) float64 {
if region == "CA" {
return 0.0725
}
return 0
}// api/http.go
package api
import (
"example.com/checkout/checkout"
"example.com/checkout/internal/tax"
)
func Quote(c checkout.Cart, region string) float64 {
return tax.Rate(region) * float64(len(c.Items))
}O que isso demonstra:
internal/tax pode ser chamado de api/ porque api está sob o pai internal example.com/checkout.checkout e api, mas não internal/tax.tax.Rate).Nomes curtos são fáceis de ler nos locais de chamada porque o caminho de importação já fornece contexto.
internal apenas quando o pacote importador está abaixo do diretório que contém a pasta internal.Para .../checkout/internal/tax, os importadores devem residir sob .../checkout/.
package foo e package bar na mesma pasta.| Regra | Justificativa |
|---|---|
| Minúsculas, sem underscores | Corresponde ao estilo Go e à ergonomia de importação |
Sem util, common, misc | Nomes devem indicar o que o pacote faz |
Evitar repetição (http.HTTPServer de net/http é uma exceção da biblioteca padrão) | Locais de chamada leem de forma mais limpa |
| Um pacote por diretório | Grafo de build e testes permanecem previsíveis |
| Corresponder ao modelo mental dos importadores | Pacote encoding/json tem nome json, não encodingjson |
| Diretório | Aplicação | Uso Típico |
|---|---|---|
internal/ | Imposto pelo compilador | Implementação privada, helpers instáveis |
pkg/ | Apenas convenção | API pública documentada para outros repositórios |
| Pacotes nomeados de nível superior | Públicos por padrão | Modelos de domínio e bibliotecas estáveis |
pkg/ não oculta símbolos.
Se você precisar de garantias fortes, use internal/.
// Ruim: repetição no local de chamada quando a importação é renomeada incorretamente
import checkoutinternal "example.com/checkout/internal/checkout"
// Bom: detalhe interno com nome de pacote curto
import "example.com/checkout/internal/tax"// internal/ aninhado ainda mais fundo funciona - a regra é por diretório internal
// example.com/checkout/internal/payment/gateway/gateway.go
package gatewaymain e casos bem conhecidos da biblioteca padrão.internal é baseado em caminho, não em visibilidade. Identificadores em minúsculas já são privados do pacote; internal/ bloqueia importações entre módulos completamente.internal/ é uma alteração que quebra a compatibilidade para quem importou o caminho antigo.utils) se tornam gavetas de bagunça. Divida por responsabilidade em vez disso.package foo_test ficam ao lado de foo e são um pacote separado para testes de caixa preta.internal/ quando as equipes precisam de semver separado.internal/ entre módulos).A linguagem permite, mas guias de estilo e ferramentas esperam nomes de palavra única em minúsculas.
Underscores são raros e distraem nos blocos de importação.
Qualquer pacote cujo diretório esteja sob example.com/checkout/, incluindo api/ e cmd/checkoutd/.
Pacotes em outros módulos não podem, mesmo que dependam de example.com/checkout.
Sim, na maioria dos casos.
Incompatibilidade (diretório mypkg, package foo) força sobrecarga mental e confunde go doc.
Não - muitos projetos exportam pacotes da raiz do módulo ou pastas nomeadas de nível superior.
Use pkg/ quando quiser uma zona óbvia "suportada para uso externo".
Adicione o novo caminho, reexporte ou migre os chamadores, deprecie o antigo caminho de importação nas notas de lançamento e remova em um major bump para bibliotecas.
Sim - internal apenas restringe importadores externos, não irmãos sob a mesma árvore.
Coloque helpers em internal/testutil ou exporte tags de build apenas para teste com moderação.
Evite que binários de produção importem pacotes de teste.
go vet e linters como revive podem sinalizar problemas de repetição e estilo.
Habilite-os em CI para consistência.
Cada módulo tem sua própria árvore.
internal no módulo A não se aplica ao módulo B, mesmo que ambos vivam no mesmo repositório Git.
Quando obscurece o significado nos locais de chamada.
Prefira version ou nomes específicos do domínio, a menos que o escopo seja minúsculo e local.
internalVersões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026