商业网站源码免费下载,网站开发资格证书,凡科网登录入口注册,国内公司名字可以做国外网站入口函数与包初始化#xff1a;搞清 Go 程序的执行次序
main.main 函数#xff1a;Go 应用的入口函数
Go 语言中有一个特殊的函数#xff1a;main 包中的 main 函数#xff0c;也就是 main.main#xff0c;它是所有 Go 可执行程序的用户层执行逻辑的入口函数。 Go 程序在…入口函数与包初始化搞清 Go 程序的执行次序
main.main 函数Go 应用的入口函数
Go 语言中有一个特殊的函数main 包中的 main 函数也就是 main.main它是所有 Go 可执行程序的用户层执行逻辑的入口函数。 Go 程序在用户层面的执行逻辑会在这个函数内按照它的调用顺序展开。main 函数的函数原型非常简单没有参数也没有返回值。Go 语言要求可执行程序的 main 包必须定义 main 函数否则 Go 编译器会报错。在启动了多个 Goroutine 的 Go 应用中main.main 函数将在 Go 应用的主 Goroutine 中执行。不过对于 main 包的 main 函数来说还需要明确一点就是它虽然是用户层逻辑的入口函数但它却不一定是用户层第一个被执行的函数。
init 函数Go 包的初始化函数
Go 语言还有一个特殊函数它就是用于进行包初始化的 init 函数了。和 main.main 函数一样init 函数也是一个无参数无返回值的函数。如果 main 包依赖的包中定义了 init 函数或者是 main 包自身定义了 init 函数那么 Go 程序在这个包初始化的时候就会自动调用它的 init 函数因此这些 init 函数的执行就都会发生在 main 函数之前。 在初始化 Go 包时Go 会按照一定的次序逐一、顺序地调用这个包的 init 函数。一般来说先传递给 Go 编译器的源文件中的 init 函数会先被执行而同一个源文件中的多个 init 函数会按声明顺序依次执行。当我们要在 main.main 函数执行之前执行一些函数或语句的时候我们只需要将它放入 init 函数中就可以了。
Go 包的初始化次序
Go 包是程序逻辑封装的基本单元每个包都可以理解为是一个“自治”的、封装良好的、对外部暴露有限接口的基本单元。 一个 Go 程序就是由一组包组成的程序的初始化就是这些包的初始化。每个 Go 包还会有自己的依赖包、常量、变量、init 函数其中 main 包有 main 函数等。我们在阅读和理解代码的时候需要知道这些元素在在程序初始化过程中的初始化顺序这样便于我们确定在某一行代码处这些元素的当前状态。 Go 在进行包初始化的过程中会采用“深度优先”的原则递归初始化各个包的依赖包。Go 会按照“常量 - 变量 - init 函数”的顺序进行初始化执行完这些初始化工作后才正式进入程序的函数。包内的多个 init 函数按出现次序进行自动调用。
init 函数的用途
init 函数的第一个常用用途重置包级变量值。init 函数就好比 Go 包真正投入使用之前唯一的“质检员”负责对包内部以及暴露到外部的包级数据主要是包级变量的初始状态进行检查。init 函数的第二个常用用途是实现对包级变量的复杂初始化。init 函数的第三个常用用途在 init 函数中实现“注册模式”。通过在 init 函数中注册自己的实现的模式就有效降低了 Go 包对外的直接暴露。