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