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

去包初始化

龙哲
2023-03-14
问题内容

情况:

Go程序包 A 由3个.go文件组成,每个文件中我都使用另一个程序包 B 中的函数。我必须在每个文件的开头导入包 B。

题:

程序包 B 实际上是初始化3次还是仅初始化1次?


问题答案:

简短答案:初始化仅执行一次。

长答案:引用相关的规范部分- 程序执行:

通过为所有包级变量分配初始值,然后使用名称和签名调用任何包级函数来初始化不导入的包

func init()

在其来源中定义。名称为package-scope或file-
scope的标识符init只能声明为具有此签名的函数。即使在单个源文件中,也可以定义多个此类功能;它们以未指定的顺序执行。

在程序包中,程序包级别的变量将根据引用顺序进行初始化,并确定常量值:如果A的初始化程序依赖于B,则A将在B之后设置。依赖性分析不依赖于A的实际值。项仅在其在源中出现时才被初始化。如果A的值包含B的提及,包含其初始值设定项提及B的值或递归提及B的函数,则A取决于B。如果这种依赖性形成一个循环,那就是错误的。如果两个项目不是相互依存的,则将按照它们在源代码中出现的顺序(可能在多个文件中)的顺序进行初始化,如提交给编译器的那样。由于依赖性分析是针对每个程序包进行的,因此,如果A的初始化程序调用在另一个引用B的程序包中定义的函数,则可能会产生不确定的结果。

一个init函数不能在程序中任何地方提到。特别是,init不能显式调用,也不能将指针init分配给功能变量。

如果程序包已导入,则在初始化程序包本身之前先初始化导入的程序包。如果多个包导入一个包P,则P将仅初始化一次。

通过构造的方式导入软件包可确保初始化过程中不存在循环依赖性。

通过将单个未导入的程序包(称为 主程序包)
与它所导入的所有程序包可传递地链接起来,可以创建一个完整的程序。主程序包必须具有程序包名称,main并声明一个main不带参数也不返回值的函数。

func main() { … }

程序执行首先初始化主程序包,然后调用函数main。当函数main返回时,程序退出。它不等待其他(非主)goroutine完成。

程序包初始化-变量初始化和init函数调用-
一次在单个goroutine中顺序出现,一个程序包一次。一个init功能可能启动其他够程,可与初始化代码同时运行。但是,初始化总是按顺序对init函数进行排序init只有在返回前一个函数后,它才会启动下一个函数。



 类似资料:
  • 在需要释放类实例之前,必须调用“deinitializer”来释放内存空间。 关键字'deinit'用于释放系统资源占用的内存空间。 取消初始化仅适用于class类型。 取消分配内存空间的去初始化 当不再需要实例时,Swift 4会自动释放您的实例,以释放资源。 Swift 4通过自动引用计数(ARC)处理实例的内存管理,如自动引用计数中所述。 通常,在取消分配实例时,您无需执行手动清理。 但是,

  • 前言: 使用props去在getInitialState中生成初始state(或者在constructor中初始化)很容易导致多个数据源的问题, 也会给使用者带来这样的疑问: 我们的真正的数据源到底来自哪? 这是因为getInitialState只在组件第一次初始化的时候被调用一次. 这样做的危险在于, 有可能组件的props发生了改变但是组件却没有被更新.(见下面的例子) 新的props的值不会

  • 我的应用程序是基于Swing的。我想介绍JavaFX,并将其配置为在辅助显示器上呈现场景。我可以使用JFrame来保存JFXPanel,JFXPanel可以保存JFXPanel,但我希望使用JavaFX API来实现这一点。 将com.sun.glass.ui.application子类化并使用application.launch(这)不是一个选项,因为调用线程将被阻塞。 编辑:结论 问题:非平凡

  • 在 Swift 3 中,dispatch_once函数被删除,迁移指南建议使用初始化闭包: 让myGlobal = { … global包含对闭包调用的初始化…}() _ = myGlobal //使用myGlobal只会在首次使用时调用初始化代码。 我想从初始化闭包中访问“Self”实例变量,如下所示: 为什么“自我”在闭包中是不可接近的,如何才能使它成为现实?

  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

  • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的