Inicialização de pacotes
Quando executamos um programa Go, o compilador Go segue uma certa ordem de execução para pacotes, arquivos em um pacote e declaração de variáveis nesses arquivos.
Escopo do pacote
Um escopo é uma região em um bloco de código onde uma variável definida é acessível. O escopo de um pacote é uma região dentro de um pacote onde uma variável declarada é acessível de dentro de um pacote (através de todos os arquivos do pacote). Esta região é o bloco mais alto de qualquer arquivo no pacote.
Dê uma olhada no comando go run
. Desta vez, ao invés de executar um arquivo, temos um padrão glob para incluir todos os arquivos dentro de app
pacote para execução.
Go é inteligente o suficiente para descobrir um ponto de entrada da aplicação que é entry.go
porque ele tem main
função. Também podemos usar um comando como o abaixo (a ordem do nome do arquivo não importa).
go run src/app/version.go src/app/entry.go
💡 Você também pode usar o comando
go run app
que faz a mesma coisa e esta é uma melhor abordagem para executar um pacote.go install
ougo build
comando requer um nome de pacote, que inclui todos os arquivos dentro de um pacote, então não precisamos especificá-los como acima.
Voltando ao nosso problema principal, podemos usar a variável version
declarada em version.go
arquivo de qualquer parte do pacote mesmo que não seja exportado (como Version
), porque é declarado no escopo do pacote.
Se a variável version
tivesse sido declarada dentro de uma função, ela não estaria no escopo do pacote e o programa acima teria falhado na compilação.
Você não tem permissão para redeclarar uma variável global com o mesmo nome no mesmo pacote. Portanto, uma vez que version
variável é declarada, ela não pode ser redeclarada no escopo do pacote. Mas você está livre para redeclarar em outro lugar.
Inicialização de variável
Quando uma variável a
depende de outra variável b
, b
deve ser definida de antemão, caso contrário o programa não compilará. Go segue esta regra dentro das funções.
Mas quando estas variáveis são definidas no escopo do pacote, elas são declaradas em ciclos de inicialização. Vamos dar uma olhada no exemplo simples abaixo.