go语言的初始化顺序,包,变量,init详解

Go语言的初始化顺序,包,变量,init详解

在Go语言中,程序的初始化是从包的引入开始的。初始化的顺序非常重要。

包的初始化顺序

在包被import引入到程序中时,Go将按照以下顺序初始化包:

1.首先,Go将计算所有包级别的变量的值并执行所有init函数。这假定这些变量和init函数没有依赖于任何其他包。它们只依赖于标准库和编译器定义的本地实体。

2.接着,Go将按照以下顺序对每个非main包执行其依赖关系图上的init函数。
对一个包的初始化仅在第一次加载时运行。可以通过导入路径来引用这个包,也可以通过空白标识符(_)来强制编译器加载这个包。即使是没有用到的包,编译器也会加载它们,并触发它们的init函数。

注意:如果循环导入了两个或多个包,Go编译器将会报错。

示例1:包的初始化顺序

假设有以下三个包:pkgA,pkgB,pkgC。它们依赖关系如下:

main -> pkgA -> pkgB -> pkgC

现在,让我们假设main包导入pkgA包,pkgA包导入pkgB包,pkgB包导入pkgC并且三个包中均有一个init函数。在这个情况下,初始化顺序如下:

1.pkgC被导入,并且pkgC的init函数被执行。
2.pkgB被导入,并且pkgB的init函数被执行。
3.pkgA被导入,并且pkgA的init函数被执行。

需要注意的是,即使只导入了pkgA包,系统会自动将pkgB和pkgC包加载到内存,并执行它们的init函数。这是因为pkgA依赖pkgB,而pkgB依赖pkgC。

变量的初始化顺序

在每个包中,变量的初始化值是通过声明它们时提供的表达式来确定的。在一个大的编译单元中,包的变量将采用以下顺序进行初始化:

1.包级别变量,不依赖其他包里面的元素。
2.按包的依赖性顺序初始化每个包级别变量。

示例2:变量的初始化顺序

package main

import "fmt"

var a = "hello"

func init() {
    fmt.Println("init1")
}

func init() {
    fmt.Println("init2")
}

func main() {
    fmt.Println(a)
}

上面的代码中,变量a被初始化为字符串"hello"。在这个示例中,init1init2a被初始化之前执行。

init函数的使用

每个包可以包含任意数量的init函数。这些函数是在程序运行开始时按顺序执行的。
init函数不能接受任何参数或返回值。也就是说,它们在运行时无法与其他函数进行通信。

示例3:init函数的使用

package main

import "fmt"

func init() {
    fmt.Println("init1")
}

func init() {
    fmt.Println("init2")
}

func main() {
    fmt.Println("main")
}

上面的代码中,程序运行时将输出以下内容:

init1
init2
main

需要注意的是,init函数可以用来执行任何有关包的操作。这可能包括一些包的初始化逻辑、变量初始化或HTTP路由注册等等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:go语言的初始化顺序,包,变量,init详解 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • 简单创建json格式文件

    简单创建 JSON 格式文件 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它广泛应用于移动端和 Web 应用程序中。本篇文章将介绍如何简单创建 JSON 格式文件。 什么是 JSON 文件 JSON 文件是一种轻量级的数据格式,它由键值对(key-value pairs)构成,且支持嵌套。通常,JSON 文件的…

    其他 2023年3月28日
    00
  • 建模算法(十)——灰色理论之关联度分析

    灰色理论之关联度分析 灰色理论是一种基于不完全信息的数学方法,可以用于处理具有不确定性和不完整性的问题。关联度分析是灰色理论的一种应用,用于分析变量之间的关联程度。 灰色关联度分析的基本原理 灰色关联度分析的基本原理是将多个变量的数据序列转化为灰色数列,然后计算它们之间的关联度。灰色数列是一种特殊的数列,它由原始数据序列经过灰色预测模型处理得到。 灰色预测模…

    other 2023年5月5日
    00
  • 用 Vue.js 递归组件实现可折叠的树形菜单(demo)

    首先我们需要明确一下什么是递归组件。顾名思义,递归组件就是在组件内部使用该组件本身。在树形结构的数据展示中,经常会使用到递归组件来展示子节点。 接下来我将以“用 Vue.js 递归组件实现可折叠的树形菜单(demo)”为例,讲解一下如何使用递归组件来实现树形菜单的效果。 定义组件 首先我们需要定义一个组件,用于展示每一个菜单项。该组件需要有以下特点: 显示菜…

    other 2023年6月27日
    00
  • 使用Postgresql 实现快速插入测试数据

    使用PostgreSQL实现快速插入测试数据的完整攻略 以下是使用PostgreSQL数据库实现快速插入测试数据的完整攻略: 步骤1:创建测试数据表 首先,您需要创建一个用于存储测试数据的表。可以使用以下SQL语句创建一个示例表: CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100), e…

    other 2023年10月16日
    00
  • 金立S5.5开发者选项在什么位置?金立S5.5打开usb调试方法 如何打开USB调试?

    金立S5.5是一款移动设备,如果需要进行调试或者开发,需要开启开发者选项和USB调试。以下是详细的攻略: 1.开启开发者选项 开启开发者选项步骤: 打开设备的“设置”应用程序。 滑动屏幕并找到“关于手机”或“关于平板电脑”选项,点击进入。 在“关于手机”或“关于平板电脑”菜单中,查找“版本号”选项,多次点击版本号选项,系统将提示“您现在进入开发者模式”。 打…

    other 2023年6月26日
    00
  • Android实现拼多多地址选择器

    Android实现拼多多地址选择器攻略 拼多多地址选择器是一个常见的功能,可以让用户方便地选择地址信息。在Android中,我们可以使用以下步骤来实现这个功能。 步骤一:添加依赖库 首先,我们需要在项目的build.gradle文件中添加以下依赖库: implementation ‘com.github.jprovince:addresspicker:1.0…

    other 2023年9月6日
    00
  • 打包发布Python模块的方法详解

    以下是打包发布Python模块的方法的完整攻略: 创建项目目录结构: 在项目根目录下创建一个与模块同名的文件夹,用于存放模块的代码和相关文件。 编写模块代码: 在模块文件夹中编写模块的代码,包括函数、类、变量等。 创建setup.py文件: 在项目根目录下创建一个名为setup.py的文件,用于定义模块的元数据和打包配置。 “`python from se…

    other 2023年10月14日
    00
  • C++中栈结构建立与操作详细解析

    C++中栈结构建立与操作详细解析 什么是栈? 栈(stack)是一种特殊的数据结构,它只允许在一个端口进行插入和删除操作。这个端口常被称为栈顶(top)。栈的正常操作是先进后出(LIFO),也就是说后进入的元素会先被弹出。 举个例子,假设我们将一叠盘子放在桌子上,每新洗好一个盘子,我们就把它放在盘子栈的顶端。当我们需要取出盘子时,我们从栈顶开始一个一个地弹出…

    other 2023年6月20日
    00
合作推广
合作推广
分享本页
返回顶部