当前位置: 首页 > 面试题库 >

init()函数何时运行?

陆绍辉
2023-03-14
问题内容

我试图找到有关该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()


问题答案:

是假设你有这样:

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



 类似资料:
  • golang 里面有两个保留的函数: init 函数(能够应用于所有的 package) main 函数(只能应用于 package main) 这两个函数在定义时不能有任何的参数和返回值 go 程序会自动调用 init() 和 main(),所以你 不能 在任何地方调用这两个函数 package main 必须包含一个 main 函数,但是每个 package 中的 init 函数都是可选的 一

  • 问题内容: 如您所知,可以如下初始化对象: 是否可以通过函数定义类似这样的对象: 我的目标实际上是从API中获取对象,并通过ng-repeat将它们显示在列表中 问题答案: 该文件说将采用任何表达方式。因此,是的,只要关联的作用域定义了一个称为的函数,您就可以做上面的事情(我也为乐趣进行了验证)。 请注意,该文档说,这实际上仅旨在用于别名: ngInit用于别名化ngRepeat的特殊属性的唯一适

  • 问题内容: 当我尝试在Python 3.3中运行该代码时,该代码不执行任何操作。没有错误或任何东西。怎么了 问题答案: 您仍然必须 调用 该函数。

  • 问题内容: 我将创建一个程序(脚本),该程序在运行时会启动操作,因此我不在此程序中使用路由 我正在使用NestJS框架(要求)。 实际上,我正在尝试在文件中编写代码,并使用方法导入服务。 我的服务 我将使用服务来处理我的操作,所以我会使用DI,该DI在非类文件中不起作用。 我会知道如何以适当的方式在初始化时间内运行我的操作 问题答案: 有两种方法可以做到这一点: A)生命周期事件 使用生命周期事件

  • 我想运行我的gui,但是我不知道如何初始化这个类。我正在从python过渡到Java,所以我对这个还是相当陌生。代码有效,我只需要知道如何运行它。 如何在静态void main(String[] args)下运行init()方法?

  • 我有一个VS 2017 C#开发的Azure功能应用程序,使用VS 2017发布机制部署在消费计划上。所有功能均由定时器或服务总线触发。我看到Azure门户中运行的状态,并且功能似乎正在工作,例如,将行写入SQL Azure数据库,但是,我在尝试检查或监视功能时,在Azure门户中经常遇到错误,例如,弹出一个红色错误框,显示错误: 我查看了日志,在日志文件中看不到任何明显的东西,我尝试部署到一个新