Aula 01
Como Organizar Código de um Módulo de Go com Vários Pacotes em Diretórios Diferentes
Summary
# Resumo da Dica sobre Organização de Código em Golang
Antônio mencionou ter dúvidas sobre a organização de estruturas (structs) no Golang, especialmente em comparação ao Java, onde existe uma lógica clara de pacotes. Aqui estão as dicas e conceitos apresentados para organizar um código em Go:
## Organização de Módulos e Pacotes
1. **Módulos**:
- Um repositório de Go é considerado um módulo, definido pelo arquivo `go.mod`.
- O caminho do módulo deve refletir a localização do repositório.
2. **Pacotes**:
- Os arquivos de Go devem ser organizados em pastas, onde cada pasta representa um pacote.
- O nome da pasta deve idealmente corresponder ao nome do pacote, embora não seja obrigatório.
- Quando se importa um pacote, utiliza-se o caminho da pasta, não o nome do pacote.
3. **Estruturas (Structs)**:
- Uma estrutura pode ser definida em um único arquivo ou distribuída em vários arquivos dentro da mesma pasta.
- Para que a estrutura seja acessível de fora do pacote, sua primeira letra deve ser maiúscula.
4. **Importação**:
- Ao importar um pacote, utiliza-se o caminho no `go.mod`.
- No uso do pacote no código, referencie o nome do pacote, não o nome da pasta.
## Exemplos Práticos
- **Exemplo de um Repositório**:
- Um repositório pode ter uma pasta `config`, onde todos os arquivos relacionados têm a declaração `package config`.
- **Exemplo no Kubernetes**:
- Em uma pasta `bootstrap`, todos os arquivos dentro devem começar com `package bootstrap`.
- **Coerência no Nomenclatura**:
- É recomendado manter o nome da pasta igual ao nome do pacote para evitar confusões ao importar e usar pacotes.
## Considerações Adicionais
- A organização do código, respeitando a convenção de nomes, facilita a manutenção e a compreensão do código por outros desenvolvedores.
- Embora o Go permita flexibilidade, seguir as convenções padrão ajuda a evitar confusões no uso de pacotes e importações.
Espero que essas dicas ajudem na organização de seu código em Golang!
Video Transcript
O Antônio fez o seguinte comentário e vou dar uma dica sobre isso.
Antônio falou, tenho umas dúvidas na anatomia, se refenindo ao vídeo sobre a linguagem
Gol, né, Golang.
Existe alguma lógica ou convenção onde colocar as estruturas, um struct para o arquivo
igual a Java, no Java, dentro de um pacote organização do conteúdo asterisco.go, que
termina na instação Gol, tem algum padrão.
Então vou tentar te dar umas dicas de organização de uma base de código de Gol.
Primeiro eu vou te dar uns exemplos aqui que já existem.
Por exemplo, a GitHub.com barra Gol, Ugo.io, né, GO, HU, GO, IO, barra HU, GO, é aquele
framework de fazer site do Gol.
Por exemplo, no código fonte deles tem a pasta config, então o repositório em si é um módulo
de Gol, ele tem o arquivo gol.mod, que determina que é um módulo, e está aqui na linha 1 com
a palavra chave módulo, o caminho desse módulo que é sempre o caminho do repositório, né,
GitHub.com que as pedra barra o nome do dono, né, Gol, Ugo, IO, barra Ugo que é o nome
do repositório.
Então eu não vou me dizer para sim, né.
Então esse repositório ou módulo de Gol, ele pode ter vários pacotes, né, package,
arquivos que tem aquela primeira linha de package.
Então normalmente na organização você cria uma pasta para cada pacote, né, para cada
linha de arquivos com o mesmo package.
Por exemplo, ele tem a pasta config aqui nesse repositório, então ele vai colocar, todos
esses arquivos são relacionados ao package config, se a gente olhar por exemplo esse
primeiro aqui na linha 14 você vê que é o package config nesse arquivo, mas tem vários
outros arquivos, se eu clicar para voltar e ver outro aqui, sei lá, configprovider.go,
a linha 14 também diz package config, tá, então esses arquivos aqui são todos relacionados
ao mesmo pacote, então normalmente a gente escreve a pasta com o mesmo nome do package
que todos os arquivos dentro da pasta irão se reverir, mas note que o nome da pasta
não precisa ter o mesmo nome do package, você poderia ter esse nome da pasta diferente
do nome do package nos arquivos, tá, e na hora de dar o import você tem que se referir
ao caminho da pasta e não o nome do package, isso que é meio confuso, né, se você falar
essa pasta fosse outra coisa, né, outro nome que não seja o mesmo nome do package,
você teria que dar o import o mesmo caminho, mas na hora de usar no go, né, quando você
se referir ao package, na, por exemplo, config.com, alguma coisa aqui nesse caso, né, você
tem que usar o nome do package, né, deixa eu ver se eu acho um exemplo aqui, se eu
fazer uma busca aqui, deixa eu ver, config, eu acho que tinha um local aqui, ah, deixa
eu ver esse aqui, eu acho que tem nesse arquivo que eu tinha visto antes, config.go, deixa
eu acho isso, ugo, ugo lebe, acho que é outro repositório, mas tá certo, ah, vamos ver,
ugo, ugo lebe, ah tá aqui, nessa pasta ugo lebe, config.go, né, então note que aqui já é
outra pasta e nessa outra pasta se refere a outro, ah, outra pacote, né, né, e nesse caso ele
nomeia o package ugo lebe com o mesmo nome da pasta, mas pra demonstrar aqui aquela parte do config,
cadê, por exemplo, aquela parte ali ó, se você lá linha 43, esse arquivo tá usando aquele pacote
que você lembra que a gente acabou de ver, pra poder usar aquele pacote você importa com o
caminho do repositório, né, barra o caminho da pasta, né, então se a pasta fosse o nome
diferente do package você teria aqui que não importe, teria que dizer o nome da pasta, agora
quando você vai usar, né, depois de importar aí que é o nome do package, tá, nesse caso config.go,
tá, você vê que várias chamadas por config.provider, tá, e vários outros,
config não sei o que isso aqui, e na hora de você usar no código mesmo você tem que se
referir ao nome do package, tá, ao nome do package, não é o caminho, então por isso que a gente
vai ver pra evitar essa confusão, né, que é meio confuso, você sempre nomeia a pasta com o mesmo
nome dos arquivos do pacote, né, que todos os arquivos daquela pasta terão, certo? Então deixa
eu mostrar outro exemplo aqui do Kubernetes, foi nessa Kubernetes, barra Kubernetes, foi não,
o nome do package, barra controller, barra bootstrap, tá, como você note aqui, pelo caminho, né,
pelo padrão a convenção, esse aqui vai ser o pacote, né, bootstrap, né, se eu ver voltar aqui no
arquivo bootstrap, signer.go, eu note que em 17, né, a convenção de ter o nome do pacote, o
nome da pasta, pra todos os arquivos dentro dessa pasta bootstrap, então como é que ele define as
coisas aqui, você tinha perguntado de struct, por exemplo, esse aqui define uma struct aqui na linha
46, né, a primeira letra tem que ser maiúscula pra poder ser usada de fora, né, signer options,
e tem vários outros, signer struct e assim por diante, né, então você pode definir a sua struct em um
arquivo só ou no mesmo arquivo, depende do que você quiser, você perguntou, se quiser só um
arquivo só, você poderia escrever, por exemplo, nesse caso aqui, se você quiser só um arquivo
para o signer options, você poderia criar um arquivo chamado signer options, né, ponto go,
dentro do arquivo você tem que definir o mesmo pacote, né, que normalmente vai ser o mesmo nome
da pasta, aí é só definir assim, na hora de importar, você iria dizer import, né, vou te mostrar
onde é que tá o import aqui, deixa eu ver, eu tenho um exemplo aqui de como é importado,
deixa eu procurar signer, bootstrap, ponto signer, procurar a busca, ver se contra aqui,
todos os arquivos de go,
parece que esse exemplo que eu te dei não foi pra usar esse arquivo, onde aqui usa,
vou ver aqui, procurar no exemplo, aí em que ele importa alguma coisa do bootstrap,
deixa eu ver, controller, barra, bootstrap,
vamos ver esse aqui, então vamos ver, aqui a gente vai se chamar,
então seria, deixa eu ver o nome do go ponto mod desse cara,
ele usa k8s ponto i, ó, certo, vamos aqui confirmar, ok, vamos de novo,
vai ver o que tá procurando, ok, controller, barra, bootstrap,
controller, barra, bootstrap,
esse arquivo aqui, pronto, na linha 24, então ele importou aqui o nome do modo,
que vem no go ponto mod, normalmente é o repositório, né, a pasta pkg,
o nome do pacote é bootstrap, então vou procurar,
então esse tá usando aqui na linha 27, 28, bootstrap ponto nilsigner, né,
bootstrap ponto a uma coisa, tá, esse pôr diante, então vamos ver aqui,
então aqui eu criei a pasta aqui, dá um exemplo, vou falar aqui no, opa,
eu termina, vou falar go, mod init, aí eu tenho que dizer o nome,
getrap ponto com, caminho do repositório, eu vou só fazer algum, não existe,
tá, aí eu vou fazer, só para ter, bkmodotec barra,
modo, tá, ele deu, criei o arquivo aqui, gomod,
primeiro é a linha modo, getrap ponto com, bkmodotec barra, modo,
aí eu vou fazer o seguinte, né, vou fazer uma pasta, vou adicionar a pasta aqui,
por exemplo, matemática, né, o modo de matemática, aí todos os arquivos dentro
matemática, matemática 1, ponto go, matemática 2, ponto go,
do package matemática, que normalmente você escreve o mesmo nome da pasta,
do package, nome da pasta, então todos os arquivos serão package matemática,
aí você pode escrever as suas coisas dentro, qualquer coisa, né, sei lá,
sei lá, vai,
e 3,14,
e assim por diante, vai qualquer coisa, né, vamos ver se funciona o negócio,
eu vou criar um main, ponto go aqui,
e na hora de portar, certo, eu vou falar em port,
getrap, ponto com, barra,
bkmodotec, o caminho todo,
barra, modo, barra, matemática, né, que é o caminho da pasta, com isso,
tem que dizer package main aqui,
funkmain, e aqui eu vou colocar, né, vou usar aquele,
vt, printslend, vou importar, fmt,
vou printslend, agora o nome do package pra usar é
patemática, ponto pi, né, pi,
vou aqui no meu, vou falar go run, main, ponto go,
tá 3,14 como, esperado, né, agora vou te mostrar aqui como fazer
outro, né, você poderia ter outro módulo, sei lá, outra coisa,
né, isso aqui eu vou fazer com o nome diferente pra você ver como funciona da
mesma maneira, barra meio confuso, qualquer, ponto go,
e nesse package eu vou dizer outro nome, tá, outro nome,
com o nome do package, na hora de que outro nome é diferente de outra coisa,
que é o nome da pasta, o nome do pacote package diferente de nome da pasta,
desse aqui eu vou colocar, sei lá, poderia ter umas, definir a structure como você
quiser, tá, e faria a mesma coisa que eu fiz aqui,
né, vai colocar o primeiro letra mais para poder usar de fora, né,
aí então vamos aqui fazer a melhor coisa, sei lá, valor, né,
com a primeira letra maiúscula igual a, sei lá, um, dois, três, tá,
poderia ser função ou qualquer coisa, aí eu vou no main e eu quero
importar, né, eu quero usar esse valor, como é que eu faço, né,
então vamos lá, primeiro você vai aqui e fala import,
e ele é o ponto go, né, o caminho do que tá lá definido no gomod, lembra, leia um,
a barra modo, agora a barra, outra coisa que é o nome da pasta,
o nome da pasta, com isso tudo que tá dentro dessa pasta
será importado, nesse caso esse arquivo, e o package outro nome
será disponibilizado para uso no main,
isso significa que eu posso se referir a outro nome,
tá, o nome do package, outro nome, lá quando eu quero fazer o fmt, println,
tá, eu vou falar outro nome, ponto valor, tá, vamos ver no que dá,
go run, import go, tá, agora deu um, dois, três, como a segunda
a print no console, tá, então note aqui que o nome, quando você se refere no
código, você tem que usar o nome do package, não é o nome da pasta,
o nome da pasta é quando você importa, tá, agora o uso no código é o
nome do package, tá, eu demonstrei aqui que é linha 5, né,
o nome da pasta é diferente do nome do package, por isso que é meio confuso,
né, você concorda, por isso que a gente sempre nomeia, né,
em vez de falar outra coisa lá, é melhor você nomear com o nome do package,
né, outro nome, é, e para o outro nome aqui, aí quando você dá import,
você fala outro nome, que vai corresponder ao mesmo nome do package,
para não ter essa confusão toda, assim não se quando você tem outro nome
diferente da pasta, aí o cara não vai saber, não dá um dia que ver esse
negócio aqui, outro nome, eu não sei, aí você tem que pesquisar e ver,
então quando você coloca o mesmo nome da pasta para o package,
segue essa convenção, aí o cara vai saber, na mesma hora,
ah, outro nome veio dessa, dessa import, dessa pasta aqui, por convenção,
certo?
Então agora a questão de você ter um struct, um por arquivo, não,
é, depende de você, se você quiser que um arquivo só tenha,
só aquele struct pode ser, como eu fiz aqui, por exemplo, no arquivo,
qualquer, só tem esse, essa variável constante aqui, ou você pode combinar
em outros arquivos que já tem várias funções, sei lá, funk, alguma coisa,
também, depende de você, tá?
Mas você decide como quer organizar, mas você pode dividir o seu código
em vários arquivos, na mesma pasta que vai corresponder a todos os arquivos
se referem ao mesmo package, dá contanto que cada arquivo tem
a mesma linha package, você segue esse padrão, e nomeia a pasta com o mesmo
nome do package, e na hora do import não vai ter confusão,
para o import, caminho do modo, que é o repositório, barra o caminho
no sistema de arquivo, da pastas, e esse caso que poderia ter várias sub-pastas,
poder ter uma pasta dentro de outra pasta dentro de outra pasta,
e seria a mesma convenção, você coloca a ABC, não importa,
segue a mesma convenção, tá?
Tá bom?
Então eu espero que tenha ajudado essa dica aí, de organização do
modelo e package no Go, dá Antônio, e até a próxima, valeu!
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: