是假设你有这样:
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()每个程序包可以具有多个功能。它们将按照它们在文件中显示的顺序执行(当然,在初始化所有变量之后)。如果它们跨越多个文件,则将按词汇文件名顺序执行:
似乎
init()函数是按词法文件名顺序执行的。Go规范说:“鼓励构建系统以词法文件名的顺序向编译器提供属于同一软件包的多个文件”。看来gobuild这种方式。
许多内部Go软件包用于
init()初始化表等,例如https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)