Go > Packages and Modules > Creating Packages > Package initialization
Package Initialization in Go
Learn how packages are initialized in Go, including the use of the init function for setting up package state. Understand the order of initialization and how it impacts your code.
Basic Package Initialization
This code demonstrates a basic package with an init function. The init function is automatically executed when the package is imported. It's often used for initializing variables or setting up resources. Note the init function has no parameters and no return values. It's implicitly declared. The execution order is determined by the import order of the packages. The variable Version is initialized within the init function.
package mypackage
import "fmt"
var Version string
func init() {
Version = "1.0.0"
fmt.Println("mypackage initialized")
}
func MyFunction() {
fmt.Println("Version:", Version)
}
Using the Package
This code demonstrates how to use the mypackage created earlier. When main imports mypackage, the init function within mypackage is executed before main's main function. The output will show 'mypackage initialized' before any other output from main.
package main
import "fmt"
import "./mypackage"
func main() {
fmt.Println("main package started")
mypackage.MyFunction()
fmt.Println("main package finished")
}
Concepts Behind Package Initialization
Package initialization ensures that the necessary setup is performed before any part of the package is used. The init function is the core mechanism for performing this setup. The order of initialization is crucial: Package-level variables are initialized in the order they're declared, taking into account dependencies. Then, all init functions in the package are executed, also in the order they appear in the source files. Finally the main function of the main package is executed.
Real-Life Use Case
Consider a database connection package. The init function could establish the initial database connection, load configuration files, or perform database schema migrations before any code that uses the database is executed. Another common use case is registering a database driver with the database/sql package. This guarantees that the driver is available before any queries are executed.
Best Practices
init functions simple and focused on essential setup tasks.init functions, as they can slow down application startup.init functions, potentially logging errors and exiting the program if a critical dependency fails to initialize.
Interview Tip
Be prepared to explain the order of package initialization in Go. Understand the difference between variable initialization and init function execution. Also, be aware of potential pitfalls, such as circular dependencies between packages.
When to Use Them
Use init functions for tasks that must be performed before any other code in the package can be executed. Examples include: setting up configuration parameters, registering drivers, and initializing global data structures.
Alternatives
Instead of relying solely on init functions, consider lazy initialization, where resources are initialized only when they're first needed. This can improve startup time and avoid unnecessary initialization if certain parts of the package are never used. Another approach is to use a dedicated initialization function that is explicitly called by the user of the package.
Pros
Cons
FAQ
-
What happens if multiple
initfunctions are defined in a single package?
Allinitfunctions within a package are executed, in the order they appear in the source files. Go specification does not guarantee a specific order of execution across multiple files in the same package, however, they will be executed sequentially. -
Can I pass arguments to an
initfunction?
No,initfunctions cannot accept arguments or return values. They are automatically executed by the Go runtime. -
What happens if an
initfunction causes a panic?
If aninitfunction panics, the program will terminate. It's important to handle errors gracefully withininitfunctions to prevent unexpected program termination.