有没有颠覆你的认知:Main方法一定是入口方法吗?

举报
liuzhen007 发表于 2021/05/26 15:32:22 2021/05/26
【摘要】 目录   前言 正文  前言 作为一名程序员,一定对main方法非常熟悉,一般我们会认为main方法就是执行程序的入口方法。程序首先执行main方法,真的是这样吗? 正文  main方法到底是不是程序执行的入口方法呢?这里先卖个关子。 首先来看一段Go的代码: // Declaration of the main packag...

目录

 

前言

正文 


前言

作为一名程序员,一定对main方法非常熟悉,一般我们会认为main方法就是执行程序的入口方法。程序首先执行main方法,真的是这样吗?

正文 

main方法到底是不是程序执行的入口方法呢?这里先卖个关子。

首先来看一段Go的代码:


  
  1. // Declaration of the main package
  2. package main
  3. // Importing package
  4. import "fmt"
  5. // One init() function
  6. func init() {
  7. fmt.Println("Welcome to init() function")
  8. }
  9. // Main function
  10. func main() {
  11. fmt.Println("Welcome to main() function")
  12. }

输出结果:

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

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


  
  1. // Declaration of the main package
  2. package main
  3. // Importing package
  4. import "fmt"
  5. // One init() function
  6. func init() {
  7. fmt.Println("Welcome to init() function")
  8. }
  9. // Another init() function
  10. func init() {
  11. fmt.Println("Another init() function")
  12. }
  13. // Other function
  14. func other() {
  15. fmt.Println("Other function can not be called befor main()")
  16. }
  17. // Main function
  18. func main() {
  19. fmt.Println("Welcome to main() function")
  20. }

输出结果:

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。