回答

收藏

init() 函数什么时候运行?

技术问答 技术问答 287 人阅读 | 0 人回复 | 2023-09-12

我试图找到这个init()函数在 Go精确解释 中的作用。Effective Go但我不确定我是否完全理解它所说的话。我不确定的确切句子如下:
3 X: R$ R1 e. `% l0 e- lfinally 的意思是 finally:在包中的所有变量声明都评估了它们的初始值设定项之后调用 init,而且只有在所有导入的包都初始化后才能评估。
$ n3 ~2 y/ N8 C& [* f2 c( t
什么all the variable declarations in the package have evaluated their initializers这是否意味着如果您在包及其文件中声明全局变量,init() 将不会运行,直到它被评估,然后它将运行所有 init 函数,然后在运行./main_file_name 时运行 main()?0 G$ |  o- U# s
我还读了 Mark Summerfield 围棋书:
# S" F, g. g2 K' n! J3 t' M4 M  I' c如果一个包有一个或多个 init() 函数,它们会在主包 main() 函数调用前自动执行。
9 l0 r, {3 ]) O5 Q+ h, E2 e
在我的理解中,init()只有当你计划运行 main() 时才相关,对吗?或主包。任何人都更准确地理解init()随时纠正我, Q" t0 j4 _: X
                                                                + q( H" }4 L9 |. M" p, O" j2 F
    解决方案:                                                                & |$ T+ \5 k$ q- ~- t1 C/ l
                                                                假设你有这个:是的,假设你有这个:
/ ]5 R4 `( \" e[code]var WhatIsThe = AnswerToLife()func AnswerToLife() int    return 42}func init() { / 2    WhatIsThe = 0}func main() { / 3   if WhatIsThe ==        fmt.Println("It's all a lie.")  code]AnswerToLife()保证在init()调用前运行,init()保证在main()调用前操作。
1 j% u6 c7 u9 |/ v请记住init()无论是否存在 ,main ,它总是被调用,所以如果你导入它init它将执行函数包。- r, O* ^+ E) ^" @0 r1 n* b( h/ X; _) N
此外,init()每个包可以有多个功能;它们将按照它们在文件中显示的顺序执行(当然有变量初始化后)。如果它们跨越多个文件,它们将按字法文件名的顺序执行:
' e* O5 _0 ^7 J7 X2 h似乎init()函数按词法文件名顺序执行。Go 规范说鼓励构建系统以词法文件名的顺序向编译器呈现同一包的多个文件。似乎是这样的go build工作的。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则