Código com uma leitura facil demandam um esforço menor para serem mantidos funcionando e respeitando uma arquitetura
prédeterminada. Um aspecto importante na dificuldade para a leitura de um código é o nível de aninhamento mantido nele.
Se um bloco if retornar devemos evitar o uso do else
3: Misusing init functions
Uma função init é utilizada para inicializar o estado de uma aplicação. Ela não contém nenhum argumento e não
retorna resultados. A inicialização de um pacote segue os seguintes passos:
Todas as constantes e variaveis do pacote são avalidas
a função init é executada
4: Overusing getters and setters
5: Interface pollution
Algumas situações que devemos considerar para o uso de interfaces:
Comportamento comum
Desacoplamento
Restrição de comportamento
6: Interface on the producer side
Na maioria dos casos deixe o cliente criar sua definição de interface baseada na implementação do produtor. Dessa forma
o cliente pode definir a interface mais apropiada para o seu caso de uso.
7: Returning interfaces
Retornar interfaces obrigam aos clientes dependerem da mesma abstração, se um cliente precisar de uma abstação
ele ainda pode realizar do seu lado. Retornar uma interface é tentar prever o futuro na esperança de que a abstração será útil
para todos os clientes. Abstrações não devem ser forçadas na maioria dos casos mas descobertas pelos clientes.
8: any says nothing
9: Being confused about when to use generics
10: Not being aware of the possible problems with type embedding
Em golang uma propiedade de uma struct é considerado incorporado se é declarado sem um nome:
Dessa forma métodos de Bar ficam disponiveis em Foo
Incoporar uma struct é sobre composição e não herança
11: Not using the functional options pattern
Lidar com a evolução de uma api pode ser algo frustante, mudanças na api podem obrigar a mudança de acesso em
todos os clientes do seu código para evitar isso podemos utilizar o padrão funcional de opções.
12: Project misorganization
/cmd — The main source files. The main.go of a foo application should live in /cmd/foo/main.go.
/internal — Private code that we don’t want others importing for their applications or libraries.
/pkg — Public code that we want to expose to others.
/test — Additional external tests and test data. Unit tests in Go live in the same
package as the source files. However, public API tests or integration tests, for example, should live in /test.
/configs — Configuration files.
/docs — Design and user documents.
/examples — Examples for our application and/or a public library.
/api — API contract files (Swagger, Protocol Buffers, etc.).
/web — Web application-specific assets (static files, etc.).
/build — Packaging and continuous integration (CI) files.
/scripts — Scripts for analysis, installation, and so on.
/vendor — Application dependencies (for example, Go modules dependencies).
13: Creating utility packages
é uma má pratica a criação de um pacote util, common, e base
14: Ignoring package name collisions
15: Missing code documentation
Todo elemento exportado deve ser documentado, a convenção é adicionar comentarios iniciando com o
nome do elemento exportado.