Init()包初始化
执行优先级
-
Init()
函数的执行优先级比main()
函数的执行优先级要高,也就是说程序会优先执行Init()
函数之后再执行main()
函数. -
代码如下
package main import "fmt" func init() { fmt.Println("执行了Init()函数") } func main() { fmt.Println("执行了main()函数") }
-
输出结果
执行了Init()函数 执行了main()函数
Init()函数特点
-
不能修改函数的名称
-
不能有返回值
-
程序会被自动调用,不可以被引用
-
init()
可以在任意包下,而且可以重复定义多个 -
在同一go文件下,多个
init()
函数的调用顺序是从上到下的 -
代码展示
package main import "fmt" func init() { fmt.Println("2.执行了Init()函数") } func init() { fmt.Println("1.执行了Init()函数") } func main() { fmt.Println("执行了main()函数") }
-
结果展示
2.执行了Init()函数 1.执行了Init()函数 执行了main()函数
-
同一package中的不同文件,优先执行
mian()
函数下的Init()
函数之后,将按文件名字符串进行"从小到大"排序,之后顺序调用文件中的Init()
函数 -
- 对于不同package,如果互不依赖,按照main包中import的顺序调用其包中的
init()
函数
- -
对于不同package,如果存在依赖,调用顺序为最后被依赖的最先被初始化,依赖顺序例如:
mian
导入pkg1
,pkg1
导入pkg2
,pkg2
导入pkg3
,``Init()执行顺序:
pkg3 -> pkg2 ->pkg1->mian,注意避免死循环的情况,例如
pkg3 -> pkg2 ->pkg1->mian->pkg3pkg3 -> pkg2 ->pkg1->mian
,注意避免死循环的情况,例如pkg3 -> pkg2 ->pkg1->mian->pkg3
- -
在导入包的时候在导包符号前加
_
(空白标记符),就可以只执行包内的Init()
函数,也可以避免报错 -
例如:
"_src/a"