序
本文次要钻研一下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函数你必须记住的六个特色