序
本文主要研究一下golang中的包init
包init实例
pkg1
package pkg1import ( "fmt")func init() { fmt.Println("pkg1 init1")}func init() { fmt.Println("pkg1 init2")}func Hello() { fmt.Println("pkg1 hello")}
pkg2
package pkg2import ( "fmt" "init-demo/pkg3")func init() { fmt.Println("pkg2 init1")}func init() { fmt.Println("pkg2 init2")}func World() { fmt.Println("pkg2 world") pkg3.Greet()}
pkg3
package pkg3import "fmt"func init() { fmt.Println("pkg3 init1")}func init() { fmt.Println("pkg3 init2")}func Greet() { fmt.Println("pkg3 greet")}
main
package mainimport ( "fmt" "init-demo/pkg1" "init-demo/pkg2" "time")func init() { fmt.Println("main init1")}func init() { go func() { fmt.Println("main init2 with go routine") time.Sleep(time.Second * 5) fmt.Println("main init2 finish sleep") }()}func init() { fmt.Println("main init3")}func main() { fmt.Println("main") pkg2.World() pkg1.Hello() time.Sleep(time.Second * 10)}
输出
pkg1 init1pkg1 init2pkg3 init1pkg3 init2pkg2 init1pkg2 init2main init1main init3mainpkg2 worldpkg3 greetpkg1 hellomain init2 with go routinemain init2 finish sleep
小结
- 每个package可以定义多个init函数,甚至在同一个go文件也可以有多个init函数。
- 如果一个包没有import其他包,则多个init按出现顺序初始化
- 同一个包多个文件都有init函数则按文件名顺序初始化
- 一般go fmt的话,会对import进行排序,这样子保证初始化行为的可再现性
- 如果一个包有import其他包,则按依赖顺序从最里层包开始初始化
doc
- Package_initialization
- Go语言init函数你必须记住的六个特征