【Go面试向】Go程序的执行顺序

【Go】Go程序的执行顺序

大家好 我是寸铁👊
总结了一篇Go程序的执行顺序的文章✨
喜欢的小伙伴可以点点关注 💝


Go程序内容

go程序通常包含: 包、常量、变量、init()、main()等元素

下面从这几个方面分别去梳理!

包的执行顺序

程序中的包

  • 一个.go文件中,其他的包只有被main包import才会执行,按照import的先后顺序执行。
  • 依赖的包的初始化顺序与其import顺序相反,或者说按照**“深度优先”**的顺序执行例如:导入顺序为main->A->B->C,则初始化顺序为C->B->A->main , 如下图所示:
  • 避免出现循环import,例如: A --> B --> C -->A
    在这里插入图片描述
  • main包总是被最后一个初始化,因为它总是依赖别的包。
  • 一个包被其他多个包依赖的包,只会初始化一次。

包的内部

  • 每个包内部按照常量=>变量=>init()函数的顺序进行初始化
  • 包内的init()函数按照出现次序自动调用

import、常量、变量、init()、main()

在同一个go文件中,import常量变量init()main()依次进行初始化。


要了解init函数和main函数的执行顺序,先要熟悉这两个函数的特点

init和main函数的特点

init()、main()是go语言中的保留函数
init函数的特点:

  • init函数先于main函数自动执行不能被其他函数调用;
  • init函数没有输入参数、返回值
  • 每个包可以有多个init函数;
  • 包的每个原文件也可以有多个init函数,这点比较特殊;
  • 同一个包的init执行顺序,golang没有明确定义
  • 不同包的init函数按照包导入的依赖关系决定执行顺序

init和main函数的的区别:

相同点
  • 两个函数在定义时不能有任何的参数和返回值
  • 该函数只能由go程序自动调用,不可以被引用
不同点
  • init函数可以应用于任意包中,且可以重复定义多个
    补充:
    1. 在同一个package中,可以在多个文件中定义init函数
    2. 在同一个go文件中,可以重复定义多个init函数
  • main函数只能用于main包中,且只能定义一个。

下面进入重头戏!

init函数的执行顺序

  • 对于同一个package中的不同文件,将文件名按照字符串字典序"从小到大"进行排序,之后按顺序调用各个文件中的init()函数。
  • 对于同一个文件的多个init ()函数,按照在代码中编写的顺序依次执行不同的init 函数。

官方:同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)
面试时可以说虽然官方的说法是这样,但是实际上运行时执行的顺序如上描述

  • 对于不同的package,如果不相互依赖的话,按照main包中的import的顺序调用其包中的init() 函数。

  • 如果package存在依赖,调用顺序为最后被依赖的最先被初始化,例如:导入顺序:main->A->B->C ,则初始化顺序为C->B->A->main,依次执行对应的init ()函数。
    在这里插入图片描述
    注意:
    所有init函数都在同一个goroutine内执行。
    所有init函数结束后才会执行main.main函数。


面试官:多个包 init 的执行顺序?单个包多个 init 函数的执行顺序, init 函数的用途?

多个包init的执行顺序

  • 对于不同的package,如果不相互依赖的话,按照main包中的import的顺序调用其包中的init() 函数。

  • 如果package存在依赖,调用顺序为最后被依赖的最先被初始化,例如:导入顺序:main->A->B->C ,则初始化顺序为C->B->A->main,依次执行对应的init ()函数。
    在这里插入图片描述

单个包多个init函数的执行顺序

  • 对于同一个package中的不同文件,将文件名按照字符串字典序"从小到大"进行排序,之后按顺序调用各个文件中的init()函数。
  • 而对于同一个文件的多个init ()函数,按照在代码中编写的顺序依次执行不同的init 函数。

官方:同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)
面试时可以说虽然官方的说法是这样,但是实际上运行时执行的顺序如上描述

init函数的用途

init函数是用于程序执行前初始化包的函数,比如初始化包里的全局变量

  • 初始化不能采用初始化表达式初始化的变量。
  • 程序运行前的注册
  • 实现sync.Once功能。
  • 其他

看到这里的小伙伴,恭喜你又掌握了一个知识点👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统常用命令行指令

Linux系统是一种常用于开源项目开发的生产环境,因其免费、开源、安全、稳定的特点被广泛应用于手机、平板电脑、路由器、电视和电子游戏机等嵌入式系统中,能够更加简便地让用户知道系统是怎样工作的。前几日我安装好了Red Hat Enterprise Linux 9.0&…

Linux的常见指令和基本操作演绎【复习篇章一】

文章目录 前言下载安装 XShellXShell 下的复制粘贴热键操作01.ls指令tree 02.cd指令03.touch指令04.mkdir指令(重要):05.rmdir指令 && rm 指令(重要)06.组合07.man指令(重要)&#xff1…

SpringMVC:企业级解读(二)

目录 八. 构建卓越JavaWeb应用:最佳实践与性能优化 1. 代码组织与规范 2. 全局异常处理与日志记录 3. 性能优化与安全性考虑 4. 分布式应用 5. 提高Spring MVC的开发效率和代码质量 九. 构建卓越用户体验:Themes 与 UI 组件集成 1. 主题与CSS预处…

《WebKit 技术内幕》学习之十一(4):多媒体

4 WebRTC 4.1 历史 相信读者都有过使用Tencent QQ或者FaceTime进行视频通话的经历,这样的应用场景相当典型和流行,但是基本上来说它们都是每个公司推出的私有产品,而且通信等协议也都是保密的,这使得一种产品的用户基本上不可能…

SpringBoot应用开发的jar包,怎样在服务器重启情况下,自启动,从而实现远程无人值守

1.编写启动脚本用于jar # 1、vim创建脚本vim startup.sh# 2、命令行模式下输入i# 3、添加以下内容 #!/bin/bashnohup java -Xms2048m -Xmx2048m -Xmn1024m -Xss1024k -Dfile.encodingUTF-8 -server -XX:HeapDumpOnOutOfMemoryError -jar XXX-api-1.0.0.jar > XXX-api.log 2…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中,需要用深度学习模型…

Ubuntu 常用命令、docker 常用命令、unzip常用命令、tar常用命令

ubuntu 常用命令&#xff1a; 进入管理员模式&#xff1a; sudo su退出管理员模式&#xff1a; su <用户名>重启系统&#xff1a; rebootubuntu 复制文件夹下文件到其他文件夹下 cp -r source_folder/* destination_folder/删除文件夹下内容而不删除自身(进入到目录…

天天酷跑-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;天天酷跑 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 【程序员Rock】C语言项目&#xff1a;手写天天酷跑丨大一课程设计首选项目&#xff0c;手把手带你用…

【linux】Debian挂起和休眠

一、挂起和休眠 在Debian桌面系统中&#xff0c;挂起和休眠是两种不同的状态&#xff0c;它们之间有一些区别。 挂起&#xff08;Suspend&#xff09;是将当前系统的状态保存到RAM&#xff08;内存&#xff09;中&#xff0c;然后关闭所有硬件设备&#xff0c;除了RAM之外。在…

如何用H5+CSS+JS写一个简单的招聘网站

大家好&#xff0c;我是猿码叔叔&#xff0c;一个 Java 语言开发者。应网友要求&#xff0c;写一个简单的招聘页面。由于技术原因&#xff0c;页面相对简单&#xff0c;朋友们可以选择性的阅读&#xff0c;如果对您有帮助&#xff0c;也可直接拿去使用&#xff0c;因为接下来除…

数据分析的理念、流程、方法、工具(下)

四、用户分群 1、用户分群 用户分群是精细化运营的基础要求&#xff0c;也是数据分析的最基础方式。对用户进行分群&#xff0c;能帮助我们了解每个细分群体用户的变化情况&#xff0c;进而了解用户的整体现状及发展趋势。同时&#xff0c;由于运营资源本身有限&#xff0c;不…

动态数据源dynamic-spring-boot-starter

将数据库相关依赖引入 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter…

满意度调研需要注意什么

本文由群狼调研&#xff08;长沙食堂满意度调查&#xff09;出品&#xff0c;欢迎转载&#xff0c;请注明出处。满意度调研是一种市场调查方法&#xff0c;用于了解顾客对产品或服务的满意程度。通过满意度调研&#xff0c;企业可以找到影响顾客满意度的关键因素&#xff0c;以…

技术变革下职业危机

方向一&#xff1a;技术变革 1.人工智能&#xff08;AI&#xff09;&#xff1a;AI技术的快速发展正在改变各个行业。AI在医疗诊断、金融分析、客户服务以及物流管理等方面都有广泛应用&#xff0c;提高了效率和准确性。但同时也引发了一些道德和道德问题&#xff0c;比如隐私…

Java 值传递详解

形参&实参 方法的定义可能会用到 参数&#xff08;有参的方法&#xff09;&#xff0c;参数在程序语言中分为&#xff1a; 实参&#xff08;实际参数&#xff0c;Arguments&#xff09;&#xff1a;用于传递给函数/方法的参数&#xff0c;必须有确定的值。形参&#xff0…

玩法与画面全面升级,艾尔莎H311-PRO和你玩转《如龙8:无尽财富》

作为经典的日系开放式世界游戏系列&#xff0c;《如龙》至今已经推出了有十多部作品&#xff0c;它凭借着经典的日式RPG玩法吸引了不少忠实粉丝。早在2022年9月的时候&#xff0c;世嘉就已经公布了最新的正统续作《如龙8》&#xff0c;而在经历了一年半的等待以后&#xff0c;我…

jvs-rules(规则引擎)1.23功能更新说明,新增SQL变量、数据源等

规则引擎更新功能 新增: 1、新增SQL变量&#xff1a; SQL变量通常指的是在执行SQL查询时使用的动态变量。这些变量允许在查询中注入或更改某些值&#xff0c;以便根据不同的条件或输入执行不同的查询。 1.1 新增自定义SQL语言进行数据查询&#xff1b; 用户可以使用自定义的…

强化学习12——策略梯度算法学习

Q-learning、DQN算法是基于价值的算法&#xff0c;通过学习值函数、根据值函数导出策略&#xff1b;而基于策略的算法&#xff0c;是直接显示地学习目标策略&#xff0c;策略梯度算法就是基于策略的算法。 策略梯度介绍 将策略描述为带有参数 θ \theta θ 的连续函数&#…

Android签名 (四) 实践 | INSTALL_PARSE_FAILED_NO_CERTIFICATES

1. 问题描述 最近在安装一个apk时出现下面的报错&#xff1a; adb: failed to install JackDemo.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package com.jack.demo] 安装环境&#xf…

Pycharm运行提示(运行‘Python测试(00.py内)‘(u)

为什么有时候我在pycharm中运行代码会出现图片中的问题&#xff1f; 我们该如何改过来&#xff1f; 很简单 点击文件-设置 点击Python集成工具&#xff0c;在默认测试运行程序里修改为Unittest即可 再次运行代码就会显示正常的运行 你的pycharm可能是英文 如何英文变中文&…