我试图找到关于 init()
函数在 Go 中的作用的精确解释。我读了 Effective Go 的内容,但我不确定我是否完全理解它的内容。我不确定的确切句子如下:
finally 的意思是 finally:在包中的所有变量声明都评估了它们的初始化器之后调用 init,并且只有在所有导入的包都初始化之后才评估这些变量。
all the variable declarations in the package have evaluated their initializers
是什么意思?这是否意味着如果您在包及其文件中声明“全局”变量,则 init() 将不会运行,直到对所有变量进行评估,然后它将运行所有 init 函数,然后在运行 ./main_file_name 时运行 main() ?
我还阅读了 Mark Summerfield 的 go book 以下内容:
如果一个包有一个或多个 init() 函数,它们会在主包的 main() 函数被调用之前自动执行。
据我了解, init()
仅在您打算运行 main() 时才相关,对吗?任何人都更准确地理解 init()
随时纠正我
原文由 Charlie Parker 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,假设你有 这个:
AnswerToLife()
is guaranteed to run beforeinit()
is called, andinit()
is guaranteed to run beforemain()
is called.请记住
init()
总是被调用,不管是否有 main ,所以如果你导入一个有init
函数的包,它将被执行。此外,每个包可以有多个
init()
函数;它们将按照它们在文件中出现的顺序执行(当然是在所有变量都初始化之后)。如果它们跨越多个文件,它们将按词法文件名顺序执行(正如 @benc 所指出的):许多内部 Go 包使用
init()
来初始化表等,例如 https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480