Main方法一定是程序的入口方法吗?|Go主题月

874 阅读2分钟

目录

前言

正文

结论

前言

作为一名程序员,一定对main方法非常熟悉,一般我们会认为main方法就是执行程序的入口方法。特别是大学期间学习过C、C++、Java编程语言的同学,这是一个很普遍的“基础认知”。那么,程序永远都是首先执行main方法?真的是这样吗?今天就带大家领略一番不一样的main方法。

正文

关于今天讨论的主题,main方法到底是不是程序执行的入口方法呢?这里先卖个关子。

首先来看一段Go的代码:

// 声明主包名称
package main 

// 导入依赖包 
import "fmt"

// 初始化方法
func init() { 
	fmt.Println("Welcome to init() function") 
} 

// 主方法 
func main() { 
	fmt.Println("Welcome to main() function") 
} 

输出结果:

Welcome to init() function
Welcome to main() function

看到这里有没有发现什么?init()方法居然在main方法之前执行了,是不是和我们传统认知有出入。不仅如此,再来看一个:

// 声明主包名称 package main 

// 导入依赖包 import "fmt"

// 初始化方法1
func init() { 
	fmt.Println("Welcome to init() function") 
} 

// 初始化方法2
func init() { 
	fmt.Println("Another init() function") 
} 

// 其他方法
func other() {
	fmt.Println("Other function can not be called befor main()")
}

// 主方法 
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()方法。 

结论

综上所述,我们可以得出今天的结论:main()方法不一定是执行程序的入口方法,但是一个执行程序只有一个main()方法。