golang 多个 init 方法的执行顺序
在 golang
里的 main
函数是程序的入口函数,main
函数返回后,程序也就结束了。golang
还有另外一个特殊的函数 init
函数,先于 main
函数执行,实现包级别的一些初始化操作,那么多个 init
函数的执行顺序是怎么样的呢?让我们实践一下看下结果吧。
目录结构:
├── a
│ └── a.go
├── b
│ └── b.go
└── main.go
main.go
文件代码:
package main
import (
"fmt"
"./b"
"./a"
)
func init() {
fmt.Println("main init 1")
}
func init() {
fmt.Println("main init 2")
}
func main() {
fmt.Println("main")
a.Add()
b.Add()
}
a.go
文件代码:
package a
import "fmt"
func init() {
fmt.Println("a init")
}
func Add() {
fmt.Println("a Add")
}
b.go
文件代码:
package b
import "fmt"
func init(){
fmt.Println("b init")
}
func Add(){
fmt.Println("b Add")
}
输出结果:
👉 [gotest] go run main.go
b init
a init
main init 1
main init 2
main
a Add
b Add
结论:
可以看出执行顺序是按照导入包的顺序执行,而不是按照调用先后顺序执行。
init
函数的主要作用:初始化。
init
函数的主要特点:
init
函数先于main
函数自动执行,不能被其他函数调用;init
函数没有输入参数、返回值;- 每个包可以有多个
init
函数; - 包的每个源文件也可以有多个
init
函数,这点比较特殊; - 同一个包的
init
执行顺序,golang
没有明确定义,编程时要注意程序不要依赖这个执行顺序。 - 不同包的
init
函数按照包导入的依赖关系决定执行顺序。
评论