Quando e em que ordem a função init() é executada em Go?
Olá a todos! Comecei a estudar Go recentemente e me deparei com a função `init()`. A documentação diz que ela é executada automaticamente, mas não consigo entender: quando exatamente? E o que acontece se eu tiver vários arquivos em um pacote, cada um com init()? E se eu importar uma biblioteca de terceiros que também tem init()?
Aqui está meu exemplo. Tenho o pacote `database` com o arquivo `db.go`:
```go
package database
import "fmt"
var Connection string
func init() {
fmt.Println("Inicializando BD...")
Connection = "postgres://user:pass@localhost/mydb"
}
```
E o arquivo `main.go`:
```go
package main
import (
"fmt"
"myproject/database"
)
func init() {
fmt.Println("Meu init em main")
}
func main() {
fmt.Println(database.Connection)
}
```
Eu esperava que primeiro executasse o init em database, depois em main, e então main(). Mas isso é sempre assim? E se eu importar um pacote que importa outro pacote com init()? A ordem é garantida? E posso confiar no init?