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.