diff options
author | Robert Griesemer <gri@golang.org> | 2023-06-07 16:56:28 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2023-06-13 17:40:15 +0000 |
commit | ee5af6103da43c44104b1d06eaf5a23cd9b87085 (patch) | |
tree | 39e15c5d862e6ef650e2a49b009439881d89efdf /doc/go_spec.html | |
parent | 886fba5871268c2dccba2675fea5aafacab59189 (diff) | |
download | go-ee5af6103da43c44104b1d06eaf5a23cd9b87085.tar.gz go-ee5af6103da43c44104b1d06eaf5a23cd9b87085.zip |
spec: document new program initialization process
For #57411.
Change-Id: I94982d939d16ad17174f801cc167cc10ddc8da30
Reviewed-on: https://go-review.googlesource.com/c/go/+/501696
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
TryBot-Bypass: Robert Griesemer <gri@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'doc/go_spec.html')
-rw-r--r-- | doc/go_spec.html | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/doc/go_spec.html b/doc/go_spec.html index bb4a3f600c..bb5b2f3db9 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ <!--{ "Title": "The Go Programming Language Specification", - "Subtitle": "Version of June 7, 2023", + "Subtitle": "Version of June 13, 2023", "Path": "/ref/spec" }--> @@ -8003,6 +8003,9 @@ The declaration order of variables declared in multiple files is determined by the order in which the files are presented to the compiler: Variables declared in the first file are declared before any of the variables declared in the second file, and so on. +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. </p> <p> @@ -8113,15 +8116,30 @@ in a program. </p> <p> -A package with no imports is initialized by assigning initial values -to all its package-level variables followed by calling all <code>init</code> -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 <code>init</code> functions in the order they appear +in the source, possibly in multiple files, as presented +to the compiler. +</p> + +<h3 id="Program_initialization">Program initialization</h3> + +<p> +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: +</p> + +<p> +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 <a href="#Package_initialization">initialized</a>. +This step is repeated until all packages are initialized. </p> <p> @@ -8135,13 +8153,6 @@ the <code>init</code> functions: it will not invoke the next one until the previous one has returned. </p> -<p> -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. -</p> - - <h3 id="Program_execution">Program execution</h3> <p> A complete program is created by linking a single, unimported package @@ -8157,8 +8168,8 @@ func main() { … } </pre> <p> -Program execution begins by initializing the main package and then -invoking the function <code>main</code>. +Program execution begins by <a href="#Program_initialization">initializing the program</a> +and then invoking the function <code>main</code> in package <code>main</code>. When that function invocation returns, the program exits. It does not wait for other (non-<code>main</code>) goroutines to complete. </p> |