go 语言的 init 函数

init 函数概述

Go 程序都是从一个叫 main 的包中的 main 函数开始的,当 main 函数返回时,程序执行结束。

init 函数是一个特殊的函数,主要用于初始化工作,优先与 main 函数执行( 自动执行 ),不能定义参数及返回值,常见使用场景 :

初始化那些不能被初始化表达式完成初始化的变量
检查或者修复程序的状态
注册
仅执行一次的计算
更多其它场合

除了下面将要讨论到的一些差异外,你还可以在正则函数中放置任何有效的内容。

包的初始化

要想使用导入的包首先需要初始化它,这是由 golang 的运行系统完成的,主要包括(顺序很重要):

初始化导入的包(递归的定义)

在包级别为声明的变量计算并分配初始值

执行包内的 init 函数,不管包被导入多少次,都只会被初始化一次。

顺序

Go 的包中有很多的文件,如果变量和函数在包的多个文件当中,那么变量的初始化和 init 函数的调用顺序又是什么样的呢?

首先,初始化依赖机制会启动(更多 Go 中的初始化依赖)当初始化依赖机制完成的时候,就需要决定 a.go 和 z.go 中的初始化变量谁会被更早的处理,而这要取决于呈现给编译器的文件顺序。如果 z.go 先被传递到构建系统,那么变量的初始化就会比在 a.go 中先一步完成,这也同样适用于 init 函数的触发。

Go 语言规范建议我们始终使用相同的顺序传递,即按照词法顺序传递包中的文件名:

为了保证可重复的初始化行为,构建系统鼓励按照词法文件名的顺序将属于同一个包中的多个文件呈现给编译器。

package main

import "fmt"

var name string

func init() {
	fmt.Println("init run ...")
	name = "lesscode"
}

func main() {
	println(name)
}