小编典典

init() 函数何时运行?

all

我试图找到该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 的围棋书:

如果一个包有一个或多个 init() 函数,它们会在主包的 main() 函数被调用之前自动执行。

据我了解,init()仅当您打算运行 main() 时才相关,对吗?任何人都更准确地理解init()随时纠正我


阅读 121

收藏
2022-03-17

共1个答案

小编典典

是的,假设你有这个

var WhatIsThe = AnswerToLife()

func AnswerToLife() int { // 1
    return 42
}

func init() { // 2
    WhatIsThe = 0
}

func main() { // 3
    if WhatIsThe == 0 {
        fmt.Println("It's all a lie.")
    }
}

AnswerToLife()保证在init()被调用之前运行,并且init()保证在main()被调用之前运行。

请记住init(),无论是否有 main,它总是被调用,所以如果你导入一个具有init函数的包,它将被执行。

init()此外,每个包可以有多个功能;它们将按照它们在文件中显示的顺序执行(当然在所有变量都初始化之后)。如果它们跨越多个文件,它们将按词法文件名顺序执行:

似乎init()函数是按词法文件名顺序执行的。Go 规范说“鼓励构建系统将属于同一个包的多个文件按照词法文件名顺序呈现给编译器”。似乎以go build这种方式工作。


许多内部 Go
包用于init()初始化表等,例如https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480

2022-03-17