go init 函数
综述
go 语言中的的 ini
函数用于 package
包的初始化,该函数是 go
语言的一个重要的特性
有特征如下
-
init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等。
-
每个包可以拥有多个init函数。
-
包的每个源文件也可以拥有多个init函数。
-
同一个包中多个init函数的执行顺序go语言没有明确的定义(应该是顺序执行)。
-
不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序。
-
init函数不能被其他函数调用,而是在main函数执行之前,自动被调用。
-
init 函数和 main 函数一样,不能有任何参数,也不能有任何返回值。
示例:一个函数有多个 init 函数,执行顺序,从上到下
a文件
package a
import "fmt"
func init() {
fmt.Println("A 函数的第一个 init 函数")
}
func init() {
fmt.Println("A 函数的第二个 init 函数")
}
b文件
func init() {
fmt.Println("B 函数的第一个 init 函数")
fmt.Println("B 函数的第二个 init 函数")
}
此时执行 main
函数会有如下输出:
A 函数的第一个 init 函数
A 函数的第二个 init 函数
b 函数的第一个 init 函数
b 函数的第二个 init 函数
main包中,引用了其他的包,main包很其他包都有init 函数时,程序的执行顺序
程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依此类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。过程如下:
注意
- 一般来说,如果只需要一个包的 init函数,不需要这个包另外的方法,可以这么写,这样就表示只执行这个包的 init函数。
`import _ "zhao/init/a"`
import
引入package
文件,路径是文件夹的路径
`import _ "zhao/init/a"`
- 一个
.go
文件就是一个源文件