有没有颠覆你的认知:Main方法一定是入口方法吗?
目录
前言
作为一名程序员,一定对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()方法。
文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。
原文链接:liuzhen.blog.csdn.net/article/details/110246470
- 点赞
- 收藏
- 关注作者
评论(0)