Init()
函数的执行优先级比main()
函数的执行优先级要高,也就是说程序会优先执行Init()
函数之后再执行main()
函数.
代码如下
package main
import "fmt"
func init() {
fmt.Println("执行了Init()函数")
}
func main() {
fmt.Println("执行了main()函数")
}
输出结果
执行了Init()函数
执行了main()函数
不能修改函数的名称
不能有返回值
程序会被自动调用,不可以被引用
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->pkg3
执行顺序: pkg3 -> pkg2 ->pkg1->mian
,注意避免死循环的情况,例如pkg3 -> pkg2 ->pkg1->mian->pkg3
-
在导入包的时候在导包符号前加_
(空白标记符),就可以只执行包内的Init()
函数,也可以避免报错
例如: "_src/a"