Tentei encontrar uma explicação precisa do que a init()
função faz no Go. Li o que o Effective Go diz, mas não tinha certeza se entendia completamente o que dizia. A frase exata que não tenho certeza é a seguinte:
E finalmente significa finalmente: init é chamado depois que todas as declarações de variáveis no pacote avaliaram seus inicializadores e essas são avaliadas somente depois que todos os pacotes importados foram inicializados.
O que all the variable declarations in the package have evaluated their initializers
significa isso ? Isso significa que, se você declarar variáveis "globais" em um pacote e em seus arquivos, o init () não será executado até que tudo seja avaliado e, em seguida, executará toda a função init e depois main () quando o arquivo ./main_file_name for executado?
Também li o livro de Mark Summerfield:
Se um pacote tiver uma ou mais funções init (), ele será executado automaticamente antes que a função main () do pacote principal seja chamada.
No meu entendimento, init()
só é relevante quando você executa a intenção de executar main (), certo? ou o pacote principal. Alguém entende com mais precisão init()
sinta-se à vontade para me corrigir
init()
é uma coisa por pacote, eu acho ... Portanto, isso significa que, se arquivos diferentes tiverem seus própriosinits
, todas as inints serão sempre executadas imediatamente antes da execução do main ()? Você também pode me esclarecer uma coisa, por que você teria um init () sem um main e como isso funciona? Isso significa que init () é a última coisa executada antes da importação do pacote? Caso contrário, se não for importado e não houver principal, o programa nunca será executado ... certo? (a menos que seu arquivo de teste de um eu acho ...)main
, por exemplo, se você precisar inicializar várias variáveis ou carregar alguns arquivos ou fazer cálculos únicos. agora, se todo o seu programa for um pacote que não é realmente necessário, no entanto, se for vários pacotes, alguns deles poderão precisar fazer alguma inicialização específica.init
é com uma arquitetura conectável, como com o comandante do Cobra . Observe comoinit
é referenciado nos exemplosVeja esta foto. :)
import --> const --> var --> init()
Se um pacote importar outros pacotes, os pacotes importados serão inicializados primeiro.
A constante do pacote atual foi inicializada então.
As variáveis do pacote atual são inicializadas então.
Finalmente, a
init()
função do pacote atual é chamada.fonte
Algo a acrescentar a isso (que eu acrescentaria como comentário, mas no momento em que escrevi este post ainda não tinha reputação suficiente)
Tendo várias inits no mesmo pacote, ainda não encontrei nenhuma maneira garantida de saber em que ordem elas serão executadas. Por exemplo, eu tenho:
Ambas as funções contêm
config.go
e , mas, ao executar , a função foi executada primeiro (o que causou pânico no meu aplicativo).router.go
init()
router.go
Se você estiver em uma situação em que possui vários arquivos, cada um com sua própria
init()
função esteja ciente de que você não tem garantia de obter um antes do outro. É melhor usar uma atribuição de variável como o OneToOne mostra em seu exemplo. A melhor parte é: Esta declaração variável ocorrerá antes que TODAS asinit()
funções no pacote.Por exemplo
config.go:
router.go:
independentemente de
var ConfigSuccess = configureApplication()
existir emrouter.go
ouconfig.go
, ele será executado antes dainit()
execução.fonte
func initialize|loadConfig|connect
separado defunc init
, deixando func init () para coisas básicas (sem pânico). Essa separação também elimina a necessidade do hack para garantir a ordem de inicialização. Espero ser útil.init()
chamadas em um único pacote é ditada pela maneira como elas são alimentadas no compilador; ago
ferramenta ordena os arquivos em ordem alfabética. A partir de então, dentro de um único arquivo, eles são inicializados em ordem sintática. editado para a escolha de palavrasAqui está outro exemplo - https://github.com/alok87/gobyexample/blob/master/init/init.go
Saída do programa acima
fonte
Por exemplo, como uma estrutura ou uma biblioteca que você está projetando para outros usuários, esses usuários terão um
main function
código no código para executar seu aplicativo. Se o usuário importar diretamente um subpacote do projeto da sua biblioteca, oinit
desse subpacote será chamado ( uma vez ) antes de tudo. O mesmo para o pacote raiz da biblioteca, etc ...Muitas vezes você pode querer que um bloco de código seja executado sem a existência de um
main func
, diretamente ou não.Se você, como desenvolvedor da biblioteca imaginária, importar o subpacote da sua biblioteca que possui uma
init
função, ele será chamado primeiro e uma vez , você não terá ummain func
mas precisa garantir que algumas variáveis ou uma tabela, será inicializado antes das chamadas de outras funções.Uma coisa boa para lembrar e não se preocupar, é que: a
init
sempre executar uma vez por aplicativo.init
a execução acontece:init
função do pacote "chamador",main func
,var = [...] or cost = [...]
,Quando você importa um pacote, ele executa todas as suas funções init, por ordem .
Vou dar um bom exemplo de uma função init. Ele adicionará tipos mime à biblioteca de go padrão nomeada
mime
e uma função em nível de pacote usará omime
pacote padrão diretamente para obter os tipos mime personalizados que já foram inicializados em suainit
função:Espero que tenha ajudado você e outros usuários, não hesite em postar novamente se tiver mais perguntas!
fonte
https://golang.org/ref/mem#tmp_4
fonte
init
será chamado em qualquer lugar que use seu pacote (não importa a importação ou importação em branco), mas apenas uma vez.este é um pacote:
qualquer pacote (pacote principal ou qualquer pacote de teste) importa-o em branco:
ou importe-o usando:
o init registrará
0
apenas uma vez. o primeiro pacote a usá-lo, sua função init será executada antes da inicialização do pacote. Assim:A chama B, B chama C, todos eles têm init func, o init do C será executado primeiro antes do B, B antes do A.
fonte
função mutil init em uma ordem de execução do pacote:
a função init () do arquivo definido com const e variável é executada
função init executar ordem pelo nome do arquivo asc
fonte
A função init é executada primeiro e depois principal. É usado para definir algo antes da execução do programa, por exemplo:
Acessando um template, Executando o programa usando todos os núcleos, Verificando os Goos e arch etc ...
fonte