前言
作为一名程序员,一定对main方法非常熟悉,一般我们会认为main方法就是执行程序的入口方法。程序首先执行main方法,真的是这样吗?
正文
main方法到底是不是程序执行的入口方法呢?这里先卖个关子。
首先来看一段Go的代码:
// Declaration of the main package
package main
// Importing package
import "fmt"
// One init() function
func init() {
fmt.Println("Welcome to init() function")
}
// Main function
func main() {
fmt.Println("Welcome to main() function")
}
输出结果:
Welcome to init() function
Welcome to main() function
看到这里有没有发现什么?init()方法居然在main方法之前执行了,是不是和我们传统认知有出入。不仅如此,再来看一个:
// Declaration of the main package
package main
// Importing package
import "fmt"
// One init() function
func init() {
fmt.Println("Welcome to init() function")
}
// Another init() function
func init() {
fmt.Println("Another init() function")
}
// Other function
func other() {
fmt.Println("Other function can not be called befor main()")
}
// Main function
func main() {
fmt.Println("Welcome to main() function")
}
输出结果:
Welcome to init() function
Another init() function
Welcome to main() function
看到这里是不是又很惊讶,init()方法居然可以定义多个,而且还都正常执行了。同样为了区分,在代码中增加了一个对比方法other(),它不被主动调用是不会执行的。
说明init()方法是优先main()方法调用执行的,不仅Golang如此,C++也是这样的,在执行main()方法之前,会有很多类似init()方法的初始化操作,特别是加载环境变量等系统配置信息。
另外,一张图非常形象的反映了整个调用过程:
通过上图我们还可以得出如下结论:
尽管main()方法不一定是执行程序的入口方法,但是一个执行程序确实只有一个main()方法。