标签 goalng init 下的文章

Golang进阶-init()初始化

1.init()、main()是go语言中的保留函数;init()函数用于初始化信息,main()函数用于程序执行的入口

2.相同点

  • 两个函数在定义时不能有任何的返回值和参数
  • 该函数只能由go程序自动调用,不可以被引用

3.不同点

  • init可以应用于任何包中,且可以重复定义多个
  • main函数只能用于main包中,且只能定义一个

4.两个函数的执行顺序

  • 同一个go文件中的init()调用顺序是从上到下
func init() {
    fmt.Println("第一个init()函数")
}
func init() {
    fmt.Println("第二个init()函数")
}
结果:
untils包下的until.go文件下第一个init()函数
untils包下的until.go文件下第二个init()函数
  • 同一个package包中的不同文件,将文件名按字符串进行 “从小到大”排序,之后顺序调用个文件中的init()函数
untils包下的test1.go文件中的init()函数。。。
untils包下的until.go文件下第一个init()函数
untils包下的until.go文件下第二个init()函数
  • 不同的package包,如果不互相依赖的话,按照import的顺序调用init()函数
import (
    "Go_Advanced/pk1"
    "Go_Advanced/utils"
)
结果:
pk1包下的init()函数
untils包下的test1.go文件中的init()函数。。。
untils包下的until.go文件下第一个init()函数
untils包下的until.go文件下第二个init()函数
untils包下的until.go文件下count()函数
pk1包下的MyTest1函数
  • 如果pakage存在依赖,调用顺序为最后被依赖的最先被初始化;例如导入顺序 main->A->B->C, 则初始化顺序为 C->B->A->main