Go(Golang)中的init()函数是什么时候运行?

前端之家收集整理的这篇文章主要介绍了Go(Golang)中的init()函数是什么时候运行?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图找到一个精确的解释什么init()函数在Go(Golang)。我读了什么 Effective Go说,但我不确定如果我完全理解它说什么。我不确定的确切句子如下:

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()随时纠正我

是假设你有 this
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

猜你在找的Go相关文章