And finally means finally: init is called after all the variable declarations in the package have evaluated their initializers,and those are evaluated only after all the imported packages have been initialized.
包中的所有变量声明如何评估它们的初始化器是什么意思?这意味着如果你在一个包及其文件中声明“全局”变量,init()将不会运行,直到它被评估,然后它将运行所有的init函数,然后main()当./main_file_name运行?
我也读过Mark Summerfield的下面的书:
If a package has one or more init() functions they are automatically executed before the main package’s main() function is called.
在我的理解,init()只有当你打算运行main()的时候相关吗?或主包。任何人都能更精确地理解init()随时纠正我
var WhatIsThe = AnswerToLife() func AnswerToLife() int { return 42 } func init() { WhatIsThe = 0 } func main() { if WhatIsThe == 0 { fmt.Println("It's all a lie.") } }
AnswerToLife()保证在调用init()之前运行,并且init()保证在调用main()之前运行。
请记住,init()总是被调用,不管有没有main,所以如果你导入一个包含init函数的包,它将被执行。
//编辑
另外,请记住,每个包可以有多个init()函数,它们将按照它们在代码中显示的顺序执行(当然所有变量都被初始化后)。
// edit 2x
很多内部的Go包使用init()来初始化表等,例如https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480