golang的进程初始化顺序是:
1)先初始化依赖的模块,再初始化本模块
2)模块内初始化按源文件字母序初始化
3)源文件内先初始化全局变量,再调用init函数
所以需要注意的是:当全局变量初始化时,可能依赖的模块并没有初始化完成,所以最好不要使用函数来初始化本模块的全局变量,可以将之放入到init函数中。
``` code main.go
package main
import (
"fmt"
"tmp/dep"
)
var a = initGlobal()
func initGlobal() int {
fmt.Println("initGlobal main.go")
return 0
}
func main() {
fmt.Println(a, dep.B, c)
}
func init() {
fmt.Println("init() main.go")
}
```
``` code c.go
package main
import "fmt"
var c = initGlobalc()
func initGlobalc() int {
fmt.Println("initGlobal c.go")
return 0
}
func init() {
fmt.Println("init() c.go")
}
```
``` code dep/b.go
package dep
import "fmt"
var B = initGlobalb()
func initGlobalb() int {
fmt.Println("initGlobal dep")
return 0
}
func init() {
fmt.Println("init() dep")
}
```
xietaodembp:tmp xietao$ go build; ./testinitGlobal dep
init() dep
initGlobal c.go
initGlobal main.go
init() c.go
init() main.go
0 0 0
网友评论