Uma dúvida muito comum para quem está iniciando com Go é em relação a organização da estrutura do projeto. Onde colocar os Controllers, Services e Repositories? Como realizar a injeção de dependência? Como acompanhar os logs?
E para facilitar esta tarefa existe o Nunu (go-nunu/nunu), um CLI para gerar o scaffolding do seu projeto. Com ele você cria em segundos uma aplicação Go completa com uma estrutura bem organizada e com as principais bibliotecas utilizadas pela comunidade, como:
- Gin: github.com/gin-gonic/gin
Popular web framework que facilita a criação de rotas, middlewares e handlers. - Wire: github.com/google/wire
Ferramenta de geração de código criada pelo Google que auxilia na injeção de dependências. - Viper: github.com/spf13/viper
Solução de configuração completa para aplicativos Go seguindo as recomendações do 12-Factor. - Zap: github.com/uber-go/zap
Registro de logs extremamente rápido, estruturado e nivelado em Go. - Go-redis: github.com/go-redis/redis
Cliente oficial para o Redis em Go. - Swaggo: github.com/swaggo/swag
Documentação automática para aplicativos Go usando Swagger 2.0.
Características principais
- Baixa curva de aprendizado e personalização: Encapsula bibliotecas populares com as quais os Gophers estão familiarizados, permitindo que você personalize facilmente o aplicativo para atender a requisitos específicos.
- Alto desempenho e escalabilidade: Tem como objetivo ser de alto desempenho e dimensionável. Ele usa as tecnologias mais recentes e as práticas recomendadas para garantir que seu aplicativo possa lidar com alto tráfego e grandes quantidades de dados.
- Segurança e confiabilidade: Usa bibliotecas de terceiros estáveis e confiáveis para garantir a segurança e a confiabilidade do seu aplicativo.
- Modular e extensível: Projetado para ser modular e extensível. Você pode adicionar facilmente novos recursos e funcionalidades usando bibliotecas de terceiros ou criando seus próprios módulos.
- Documentação e testes completos: Conta com documentação e testes abrangentes. Ele fornece ampla documentação e exemplos para ajudá-lo a começar rapidamente. Também inclui um conjunto de testes para garantir que seu aplicativo funcione conforme o esperado.
Requisitos
Para utilizar o Nunu você precisa ter os seguintes softwares instalados em seu computador:
- Go 1.19 ou superior
- Git
- Docker (opcional)
- MySQL 5.7 ou superior (opcional)
- Redis (opcional)
Primeiros Passos
Vamos instalar o Nunu através do seguinte comando:
go install github.com/go-nunu/nunu@latest
Caso a instalação tenha ocorrido com sucesso, ao executar o comando abaixo será mostrado as informações de como usar o Nunu.
nunu -h
Criando um projeto
Para criar um projeto basta executar:
nunu create [project-name]
Você precisará escolher o tipo de projeto:
- Advanced - Estrutura mais completa com db, jwt, cron, migration, test, etc.
- Basic - Estrutura básica.
Após isso, seu projeto será criado, conforme imagem abaixo.
Ao entrar na pasta do seu projeto, você terá uma estrutura inicial da seguinte forma:
.
├── LICENSE
├── README.md
├── README_zh.md
├── cmd
│ └── server
│ ├── main.go
│ ├── wire.go
│ └── wire_gen.go
├── config
│ ├── local.yml
│ └── prod.yml
├── go.mod
├── go.sum
├── internal
│ ├── handler
│ │ ├── handler.go
│ │ └── user.go
│ ├── middleware
│ │ └── cors.go
│ ├── model
│ │ └── user.go
│ ├── repository
│ │ ├── repository.go
│ │ └── user.go
│ ├── server
│ │ └── http.go
│ └── service
│ ├── service.go
│ └── user.go
├── pkg
│ ├── config
│ │ └── config.go
│ ├── helper
│ │ ├── convert
│ │ │ └── convert.go
│ │ ├── md5
│ │ │ └── md5.go
│ │ ├── resp
│ │ │ └── resp.go
│ │ ├── sid
│ │ │ └── sid.go
│ │ └── uuid
│ │ └── uuid.go
│ ├── http
│ │ └── http.go
│ └── log
│ └── log.go
└── storage
└── logs
└── server.log
Definições dos diretórios:
cmd
: Através do arquivo server/main.go, presente nesta pasta, ocorre o bootstrap da aplicação.config
: Contém nossos arquivos de configuração com definições de porta, segurança, banco de dados e logs.internal
: Aqui estão as principais implementações de nossa aplicação, como handlers, services, models.handler
: Definições dos nossos controllers.middleware
: Contém nossos middlewares, como: CORS, Authentication, Logging, Caching, Request Tracing.model
: Estrutura com definição das entidades utilizadas no banco de dados.repository
: Contém as implementações da camada de acesso aos dados.server
: Contém as definições das rotas da aplicação, mapeando as mesmas para os handlers.service
: Camada com as definições das regras de negócio da aplicação.
pkg
: Contém pacotes independentes que fornecem alguns utilitários para aplicação.storage
: Diretório para armazenamento de arquivos estáticos, como: log, arquivos de upload, arquivos temporários, etc.
Por padrão, o em nosso scaffolding já contamos com um componente user
(handler/service/repository/model) criado.
Novos componentes podem ser criados através da linha de comando, usando:
nunu create handler company
nunu create service company
nunu create repository company
nunu create model company
ou
nunu create all company
Esses comandos criarão componentes denominados CompanyHandler
, CompanyService
, CompanyRepository
e CompanyModel
, respectivamente, e os colocarão nos diretórios corretos.
Executando o projeto
Agora que já conhecemos a estrutura da nossa aplicação, podemos executar a mesma através do comando:
nunu run
Ao abrir o navegador em: http://localhost:8000/ veremos nossa aplicação em execução!
Conclusão
A principal vantagem em utilizar o Nunu é que você já tem definida uma boa estrutura para seu projeto, sendo possível iniciar o desenvolvimento com uma etapa já concluída.