Um começo que não precisa correr
Um serviço Go pequeno costuma nascer com poucas rotas, um logger simples e algumas decisões que parecem óbvias. O problema é que essas decisões viram fundação antes de a gente perceber.
Por isso, gosto de separar cedo o que pertence ao transporte HTTP, o que pertence ao domínio e o que é infraestrutura de apoio.
Organização inicial
A estrutura não precisa ser grande. Ela só precisa deixar claro onde cada coisa mora:
cmd/inicia a aplicação;internal/transport/httpcuida das rotas;internal/blogguarda contratos do domínio;web/templateseweb/staticconcentram apresentação.
A simplicidade boa não é ausência de estrutura. É estrutura suficiente para não precisar explicar tudo de novo amanhã.
Pontos de extensão
Quando uma aplicação começa assim, trocar mocks por Markdown, banco ou outro repositório fica menos traumático. A rota não precisa saber se o texto veio do filesystem, de um CMS ou de uma tabela.
type Repository interface {
ListPublished(ctx context.Context) ([]Post, error)
FindBySlug(ctx context.Context, slug string) (Post, error)
}
O contrato pequeno segura o desenho enquanto o resto ainda está mudando.