From: Robert Griesemer
@@ -8113,15 +8116,30 @@ in a program.
-A package with no imports is initialized by assigning initial values
-to all its package-level variables followed by calling all init
-functions in the order they appear in the source, possibly in multiple files,
-as presented to the compiler.
+The entire package is initialized by assigning initial values
+to all its package-level variables followed by calling
+all init
functions in the order they appear
+in the source, possibly in multiple files, as presented
+to the compiler.
+
+The packages of a complete program are initialized stepwise, one package at a time. If a package has imports, the imported packages are initialized before initializing the package itself. If multiple packages import a package, the imported package will be initialized only once. The importing of packages, by construction, guarantees that there can be no cyclic initialization dependencies. +More precisely: +
+ ++Given the list of all packages, sorted by import path, in each step the first +uninitialized package in the list for which all imported packages (if any) are +already initialized is initialized. +This step is repeated until all packages are initialized.
@@ -8135,13 +8153,6 @@ the init
functions: it will not invoke the next one
until the previous one has returned.
-To ensure reproducible initialization behavior, build systems are encouraged -to present multiple files belonging to the same package in lexical file name -order to a compiler. -
- -A complete program is created by linking a single, unimported package @@ -8157,8 +8168,8 @@ func main() { ⦠}
-Program execution begins by initializing the main package and then
-invoking the function main
.
+Program execution begins by initializing the program
+and then invoking the function main
in package main
.
When that function invocation returns, the program exits.
It does not wait for other (non-main
) goroutines to complete.