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函数按照包导入的依赖关系决定执行顺序。
评论
