小编典典

init()函数何时运行?

go

我试图找到有关该init()函数在Go中作用的精确解释。我读了《有效围棋》所说的话,但是不确定我是否完全理解它的意思。我不确定的确切句子如下:

最后意味着:在包中的所有变量声明评估了其初始化程序之后,将调用init,并且只有在所有导入的包都已初始化之后才对init进行评估。

什么all the variable declarations in the package have evaluated their initializers意思
这是否意味着如果在包及其文件中声明“全局”变量,则init()直到所有值都被评估后才运行,然后在运行./main_file_name时它将先运行所有的init函数,然后运行main()?

我还阅读了马克·萨默菲尔德(Mark Summerfield)的以下书籍:

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

以我的理解,init()仅当您打算运行main()时才有意义吗?或主包装。任何人都可以更精确地理解init()


阅读 387

收藏
2020-07-02

共1个答案

小编典典

是假设你有这样

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规范说:“鼓励构建系统以词法文件名的顺序向编译器提供属于同一软件包的多个文件”。看来go build这种方式。


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

2020-07-02