《Go 语言第一课》课程学习笔记(五)

入口函数与包初始化:搞清 Go 程序的执行次序

main.main 函数:Go 应用的入口函数

  • Go 语言中有一个特殊的函数:main 包中的 main 函数,也就是 main.main,它是所有 Go 可执行程序的用户层执行逻辑的入口函数。
    • Go 程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。
    • main 函数的函数原型非常简单,没有参数也没有返回值。
    • Go 语言要求:可执行程序的 main 包必须定义 main 函数,否则 Go 编译器会报错。在启动了多个 Goroutine 的 Go 应用中,main.main 函数将在 Go 应用的主 Goroutine 中执行。
    • 不过对于 main 包的 main 函数来说,还需要明确一点,就是它虽然是用户层逻辑的入口函数,但它却不一定是用户层第一个被执行的函数。

init 函数:Go 包的初始化函数

  • Go 语言还有一个特殊函数,它就是用于进行包初始化的 init 函数了。和 main.main 函数一样,init 函数也是一个无参数无返回值的函数。
  • 如果 main 包依赖的包中定义了 init 函数,或者是 main 包自身定义了 init 函数,那么 Go 程序在这个包初始化的时候,就会自动调用它的 init 函数,因此这些 init 函数的执行就都会发生在 main 函数之前。
    • 在初始化 Go 包时,Go 会按照一定的次序,逐一、顺序地调用这个包的 init 函数。
    • 一般来说,先传递给 Go 编译器的源文件中的 init 函数,会先被执行;而同一个源文件中的多个 init 函数,会按声明顺序依次执行。
    • 当我们要在 main.main 函数执行之前,执行一些函数或语句的时候,我们只需要将它放入 init 函数中就可以了。

Go 包的初始化次序

  • Go 包是程序逻辑封装的基本单元,每个包都可以理解为是一个"自治"的、封装良好的、对外部暴露有限接口的基本单元。
    • 一个 Go 程序就是由一组包组成的,程序的初始化就是这些包的初始化。
    • 每个 Go 包还会有自己的依赖包、常量、变量、init 函数(其中 main 包有 main 函数)等。
    • 我们在阅读和理解代码的时候,需要知道这些元素在在程序初始化过程中的初始化顺序,这样便于我们确定在某一行代码处这些元素的当前状态。
  • Go 在进行包初始化的过程中,会采用"深度优先"的原则,递归初始化各个包的依赖包。
  • Go 会按照"常量 -> 变量 -> init 函数"的顺序进行初始化,执行完这些初始化工作后才正式进入程序的函数。包内的多个 init 函数按出现次序进行自动调用。

init 函数的用途

  • init 函数的第一个常用用途:重置包级变量值。init 函数就好比 Go 包真正投入使用之前唯一的"质检员",负责对包内部以及暴露到外部的包级数据(主要是包级变量)的初始状态进行检查。
  • init 函数的第二个常用用途,是实现对包级变量的复杂初始化。
  • init 函数的第三个常用用途:在 init 函数中实现"注册模式"。通过在 init 函数中注册自己的实现的模式,就有效降低了 Go 包对外的直接暴露。
相关推荐
qq_284274055 分钟前
间歇运动机构与机械设计概论:棘轮与槽轮机构运动系数、零件失效与强度刚度准则、结构工艺性清根及标准件(含考点)
笔记·学习·平面·自动化·制造
于眠牧北1 小时前
雷电模拟器9/14搭配charles抓取自带浏览器接口9/14
经验分享·笔记·git
Answer1st8 小时前
【嵌入式模块】UART通信模块
笔记
和侧9 小时前
离子注入后为什么必须配套退火工艺?
笔记·学习
凛铄linshuo10 小时前
自动化测试:pytest第一个实例学习
学习·pytest
我命由我1234511 小时前
智能助手通用问答边界
人工智能·python·学习·ai·学习方法·ai编程·智能体
鬼手点金11 小时前
Agent 的学习机制:后训练、上下文学习与外部化学习
java·人工智能·git·学习·自动化·nanogpt
几个几个n11 小时前
LaTeX 入门学习
学习
TheBlackHoleLab13 小时前
【Vulnhub系列】DarkHole1: 渗透测试笔记,没有踩渗透的坑,却踩到了虚拟机平台的坑,人生处处是大坑
笔记·vulnhub·easy·darkhole1
想七想八不如1140813 小时前
元学习简单入门
人工智能·pytorch·python·深度学习·学习·机器学习