From: Rob Pike
Within a package, package-level variables are initialized,
-and constant values are determined, in
-data-dependent order: if the initializer of A
-depends on the value of B
, A
+and constant values are determined, according to
+order of reference: if the initializer of A
+depends on B
, A
will be set after B
.
-It is an error if such dependencies form a cycle.
-Dependency analysis is done lexically: A
+Dependency analysis does not depend on the actual values
+of the items being initialized, only on their appearance
+in the source.
+A
depends on B
if the value of A
contains a mention of B
, contains a value
whose initializer
mentions B
, or mentions a function that
mentions B
, recursively.
+It is an error if such dependencies form a cycle.
If two items are not interdependent, they will be initialized
-in the order they appear in the source.
+in the order they appear in the source, possibly in multiple files,
+as presented to the compiler.
Since the dependency analysis is done per package, it can produce
unspecified results if A
's initializer calls a function defined
in another package that refers to B
.