一、init函数
在Go中,init函数是用于程序执行前做包(package)的初始化的函数,比如初始化包里的变量等。
- 每一个包(package)中都可以写多个init函数,但是就维护来说,建议用户在一个包中的每个文件只写一个init函数。
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- init函数是Go程序自动调用的,不能被其他函数调用。(在main函数执行之前,会被自动调用)
二、main函数
像其他编程语言一样,main函数也是Go语言程序的默认入口。
func main(){
......
}
- 与init函数不同,main函数只能存在于mian包,且一个程序的mian包里只能定义一个main函数
- 程序的初始化和执行都起始于main包。
- main函数是Go程序自动调用的,不能被其他函数调用。
三、init函数和main函数的异同点
相同点:
- 两个函数在定义时不能有任何的参数和返回值
- 两个函数都是由Go程序自动调用的,不能被调用
不同点:
- init可以应用于任意包中,且可以重复定义多个。
- main函数只能用于main包中,且只能定义一个。
四、init函数和main函数的调用流程
函数的执行顺序的理解关键点:
- 同一个go文件的init()调用顺序是从上到下的。
- 同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。
- 对于不同的package,
- 如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init()
- 如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。
(图引用的是谢大的Go Web编程)
本文参考了谢大的Go Web编程