go init 函数

综述

go 语言中的的 ini 函数用于 package 包的初始化,该函数是 go 语言的一个重要的特性

有特征如下

  1. init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等。

  2. 每个包可以拥有多个init函数。

  3. 包的每个源文件也可以拥有多个init函数。

  4. 同一个包中多个init函数的执行顺序go语言没有明确的定义(应该是顺序执行)。

  5. 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序。

  6. init函数不能被其他函数调用,而是在main函数执行之前,自动被调用。

  7. 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函数。过程如下:

注意

  1. 一般来说,如果只需要一个包的 init函数,不需要这个包另外的方法,可以这么写,这样就表示只执行这个包的 init函数。
`import _ "zhao/init/a"`
  1. import 引入package 文件,路径是文件夹的路径
`import _ "zhao/init/a"`
  1. 一个 .go 文件就是一个源文件

参考连接

  1. https://www.cnblogs.com/gwyy/p/13469431.html
  2. https://blog.csdn.net/Charliewolf/article/details/85061667
posted @ 2021-12-27 09:21  沧海一声笑rush  阅读(399)  评论(0编辑  收藏  举报