Go语言中的init函数的执行时机

多组学联合高级Mantel-test热图 对应的是「metabo」中物质间的相关性热图,单元格色块颜色表示相关系数大小,橙色表示+相关,绿色表示-相关;单元格内的数值表示相关性值大小,星号表示显著性。双组学(微生物组/ 转录组/代谢组等两两组合)关联分析,可视化组学特征间的关联显著性、强度及相关方向。表示<trans>与<metabo>中物质的Mantel test结果。表示整体相关的系数,连线颜色表示相关系数的显著性检验结果。宿主-微生物互作、疾病多组学机制、环境-生物多组学关联。为物质名称,不允许存在空值、重复值。 阅读详情

init函数的执行时机

  • 这个涉及到
    • init 函数的作用和执行顺序
    • 相同个文件和不同文件中以及在不同的包中init的执行顺序
    • go文件初始化的顺序

一、init 函数的作用和执行顺序

作用

  • init 函数是用于程序执行前做包的初始化的函数,比如初始化包里面的一些变量等等
  • 通常在项目工程中,用来做 Http Server的初始化,DB的初始化, redis 初始化等等中间件的初始化

执行顺序

  • 在同一个 Go 文件可以重复定义多个 init 方法, 它的执行顺序是按照代码编写的顺序依次执行
  • 在同一个 package 里面,不同文件中的 init 方法的执行是按照文件名的顺序先后执行各个文件当中的init方法的
  • 对于不同的package
    • 如果不相互依赖的话,就会按照main包里面 import 的顺序,调用各个包中的init函数
    • 存在依赖,调用顺序就变成最后被依赖的会最先被初始化
      • 比如我们的导入顺序是在main函数中依赖a模块
      • a模块又依赖b模块,b模块又依赖c模块
      • 初始化的顺序就会先初始化c这个包再初始化b这个包再初始化a这个包
      • 最后执行main方法

测试 同一个 Go 文件可以重复定义多个 init 方法

main.go

package main

import (
	. "fmt"
)

// 同一个go文件中的多个init方法,按照定义的顺序执行
func init() {
	Println(1)
}

func init() {
	Println(2)
}

func main() {}
  • 运行 $ go run main.go
  • 输出
    1
    2
    
  • 可见,按照 定义顺序保持一致

二、相同个文件和不同文件中以及在不同的包中init的执行顺序


2.1 测试同一个包中,不同的文件中的init执行顺序

  • init-demo/
    • go.mod
    • main.go
    • pkg/
      • a.go
      • b.go
      • pkg.go

pkg/a.go

package pkg
import . "fmt"

func init() {
	Println("pkg-a")
}

pkg/b.go

package pkg
import . "fmt"

func init() {
	Println("pkg-b")
}

pkg/pkg.go

package pkg
import . "fmt"

var Pkg = "pkg"

func init() {
	Println("pkg-pkg")
}

main.go

package main

import (
	. "fmt"
	"init-demo/pkg"
)

// 同一个go文件中的多个init方法,按照定义的顺序执行
func init() {
	Println(1)
}

func init() {
	Println(2)
}

func main() {
	println(pkg.Pkg)
}

  • 执行 $ go run main.go
  • 输出
    pkg-a
    pkg-b
    pkg-pkg
    1
    2
    pkg
    
  • main包依赖pkg包,先按照pkg中包名的 ascII 码的顺序依次执行init, 再执行 main包中的任务
  • 我们知道,先执行 pkg/a.go 中的init, 再执行 pkg/b.go中的init, 再执行 pkg/pkg.go 中的init,最终执行main方法中的任务

测试 导入不同的包有和没有依赖其他包的情况

  • init-demo/
    • go.mod
    • main.go
    • pkg1/
      • pkg1.go
    • pkg2/
      • pkg2.go

pkg1/pkg.go

package pkg1
import "fmt"

var Pkg1 = "pkg1"

func init() {
	fmt.Println("pkg1-pkg1")
}

pkg2/pkg.go

package pkg2
import "fmt"
import "init-demo/pkg3"

var Pkg2 = "pkg2"

func init() {
	fmt.Println("pkg2-pkg2")
}

pkg3/pkg.go

package pkg3
import (
	"fmt"
)

func init() {
	fmt.Println("pkg3-pkg3")
}

main.go

package main

import (
	. "fmt"
	"init-demo/pkg1"
	"init-demo/pkg2"
)

// 同一个go文件中的多个init方法,按照定义的顺序执行
func init() {
	Println(1)
}

func init() {
	Println(2)
}

func main() {
	println(pkg1.Pkg1)
	println(pkg2.Pkg2)
}

  • 执行 $ go run main.go

  • 输出

    pkg1-pkg1
    pkg3-pkg3
    pkg2-pkg2
    1
    2
    pkg1
    pkg2
    
  • 先执行pkg1的init,因为在main中被最先引入,优先按照import的顺序执行,接着是pkg3的init, 接着是pkg2的init

  • 因为 pkg3被pkg2引用,这样pkg3的init优先于pkg2的init执行

  • 最后是main包中的init和main函数的方法

三、go文件初始化的顺序

  • 会先初始化引入的包
  • 再初始化当前包中的常量变量
  • 接着初始化当前包中的init函数
  • 最后执行main函数
  • 注意
    • 一个包被引用多次,这个包的init函数只会执行一次 (按照之前的规则的执行顺序下的第一次)
    • 所有的 init 函数都会在同一个 goroutine 内执行
    • 注意包的循环导入问题,会出现异常: import cycle not allowed
  • 这里不再举例
大模型在电力交易功率预测中的应用:短期,超短期,中长期的完整解决方案代码详解 本文介绍了基于大模型的电力交易功率预测系统,该系统覆盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1月)三个时间尺度。文章详细阐述了数据准备与特征工程,包括多源数据集成和特征重要性分析。在模型构建方面,采用了Temporal Fusion Transformer (TFT)模型进行超短期预测,Informer模型进行短期预测,以及N-HiTS模型进行中长期预测。此外,文章还探讨了概率预测与风险分析,并介绍了模型部署与交易策略集成的实现。最后,文章总结了系统的贡献,并展望了未来发展方向,如市 阅读详情

相关推荐

从MySQL到数据仓库:手把手教你用Airflow实现自动化ETL流水线

本文详细介绍了如何利用Airflow构建从MySQL到数据仓库的自动化ETL流水线,涵盖增量抽取策略、PySpark转换优化和数据质量监控等实战细节。特别适合中小规模企业构建高效数据仓库,提升数据处理效率和质量。

rnn9storyteller的博客 829

golang init顺序

init 顺序 1、在同一个 package 中,可以多个文件中定义 init 方法 2、在同一个 go 文件中,可以重复定义 init 方法 3、在同一个 package 中,不同文件中的 init 方法的执行按照文件名先后执行各个文件中的 init 方法 4、在同一个文件中的多个 init 方法,按照在代码中编写的顺序依次执行不同的 init 方法 5、对于不同的 package,如果不相互依赖的话,按照 main 包中 import 的顺序调用其包中的 init() 函数 6、如果 package 存

t949500898的博客 3603

UE5Could not be compiled. Try rebuilding from source manually.

UE5Could not be compiled. Try rebuilding from source manually.

weixin_45417260的博客 2771

一文读懂 Golang init 函数执行顺序

Golang init 函数是一种特殊的函数,主要用于完成程序的初始化工作,如初始化数据库的连接、载入本地配置文件、根据命令行参数初始化全局变量等。init ainit binit cmaininit 函数是可选的,可以没有;与 main 函数一样,不能有入参与返回值;与 main 函数一样,init 会自动执行,不能被其他函数调用;一个包内可以有多个 init 函数,即可以在包的多个源文件中定义多个 init 函数。

Doublelv 的博客专栏。 7173

直流有刷电机三环PID控制:从硬件配置到软件调试全解析

本文全面解析了直流有刷电机的三环PID控制技术,涵盖从硬件选型(如驱动板、编码器)到STM32软件配置的全过程。详细阐述了位置环、速度环、电流环的串级协同工作原理与调试方法,并提供了位置式PID算法的C语言实现代码及参数整定技巧,旨在帮助开发者实现精准、稳定的电机运动控制。

weixin_29290963的博客 389

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

go 语言中 init() 函数是什么时候执行的?

在 golang 中, init() 函数是在main() 函数之前执行的。全局常量、变量是在 init 函数之前初始化的。Go语言代码执行顺序为:import –> const –> var –>init()–>main()。

lp15929801907的博客 1905

目标检测数据集 第059期-基于yolo标注格式的水果李子检测数据集(含免费分享)

李子作为中国三大水果之一,种植历史超 3000 年,在市场中占据重要地位。传统李子种植、施肥、采摘依赖大量人力,存在资源浪费、产量估算不准、采摘时机难把控等问题。此前,农业领域缺乏针对 “未成熟李子” 的专用数据集,现有水果检测数据集多聚焦于成熟果实(如苹果、柑橘),且未覆盖李子种植的复杂自然场景。在使用该数据集进行学术研究时,应遵守相关的学术规范,引用该数据集的来源,尊重数据集创作者的劳动成果。,用于训练改进型模型,解决李子精准检测的核心痛点。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 772

Golang init函数执行顺序

import --> const --> var --> init() 如果一个包导入了其他包,则首先初始化导入的包。 然后初始化当前包的常量。 接下来初始化当前包的变量。 最后,调用当前包的 init() 函数。 一个包可以有多个 init 函数 (在单个文件中或分布在多个文件中),并且按照它们呈现给编译器的顺序被调用。 一个包将只初始化一次,即使它是从多个包导入的。 原文链接:https://learnku.com/go/t/47135 ...

bob的博客 2732

Windows下Python多版本共存与切换的终极指南(含环境变量详解)

本文详细解析了在Windows系统下实现Python多版本共存与切换的完整方案。通过深入讲解环境变量Path的底层机制,提供了从安装策略、精细化Path管理到创建快速切换脚本的实战指南,并介绍了py启动器和虚拟环境等高级技巧,帮助开发者彻底解决版本冲突问题,提升开发效率。

v6b7n8m9q0的博客 538

24、语料库与科技术语库建设

本文探讨了语料库在科技术语库建设中的关键作用,重点分析了词性标注、索引、搭配、词形还原、频率计数、词汇排序和类型-标记分析等核心技术的应用与挑战。文章以印度语言为例,指出其语料库处理工具匮乏的现状,强调需开发适配本地语言特征的技术,并提出一个整合多种处理步骤的综合流程,旨在推动印度语言科技术语数据库的系统化建设,促进科技语言的发展与应用。

cola5的博客 92

Golang import、init()、main()

本文很多东西都是源自网络,稍微整理了下,是否正确尚未验证,因此,有错误的话,请留言。 一、 main() ,init()方法是go中默认的两个方法,两个保留的关键字。 init()方法 是在任何package中都可以出现,但是建议 每个package中只包含一个init()函数比较好,容易理解。 但是main() 方法只能用在package main 中。 Go程序会自动调用init(

ribavnu的专栏 1560

TDS水质检测传感器原理图设计,已量产(液体传感器)

最近调试了一款针对生活用水、水培系统的 TDS 水质检测模块 —— 毕竟 TDS(总溶解固体)值直接关联水的洁净程度,是这类场景里既实用又易获取的水质指标。下面拆解下这个电路的设计逻辑,说说每个部分是怎么配合实现精准检测的。

不脱发的程序猿 1547

65道Go基础高频题整理(附答案背诵)

在 Go 语言中,defer关键字用于推迟一个函数或方法的执行,直到包含该defer语句的函数执行完成。这个被延迟的函数被称为 “deferred function”。defer后进先出(LIFO):当在一个函数中存在多个defer语句时,它们将会以后进先出的顺序执行。也就是说,最后一个defer语句最先被执行,第一个defer语句最后被执行。参数在 defer 语句中立即求值:在defer语句中,函数的参数会立即被计算并保存,而函数本身的执行会被延迟。延迟函数的执行时机defer的函数会在包含defer。

IT6666_it的博客 490

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Go init函数详解

Go init函数详解 init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来: 对变量进行初始化 检查/修复程序的状态 注册 运行一次计算 包的初始化 为了使用导入的包,首先必须将其初始化。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。这通过Golang的运行时系统控制,如下图所示: 初始化导入的包(递归导入) 对包块中声明的变量进行计算和分配初始值 执行包中的init函数 代码如下: package main import

雪锋的笔记 488

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

golang 中的 init 和 main函数

等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。说明如果一个包会被多个包同时导入,那么它只会被导入一次,而先输出lib2是因为main包中导入Lib1时,Lib1又导入了Lib2,会首先初始化Lib2包的东西。两个保留的函数:init函数。

墨痕诉清风的博客 816

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

golang初始化顺序/执行顺序_init 下划线最佳实践

go语言的初始化顺序,包,变量,init go程序执行顺序(转) golang入门-- import包与包内init方法的执行时机 怎么用好 Golang 的 init 函数 golang 下划线(underscore)的意义 go import 下划线 的实现原理 import _ "net/http/pprof" import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" "

大漠雁 687

PHP自学Go日记(八):init函数

有时候我们希望在包被引入时马上执行某些操作,类似于PHP中的构造函数 __construct 。在Go中也有类似的函数,我们先来看一段代码:mian.go lib.go(注意:每个包都需要用个文件夹装着) 输出结果: 从结果中我们可以看到:1、inti函数是在其他函数调用前执行的2、引入的包的init函数在包被引入时执行,因此lib包的init函数执行顺序在main包的init函数前3、如果lib包也引入了其它包,且其它包也有init函数,那边该包init函数也在lib包的init函数前....

KennyCCCC的博客 294

Go 中的 init 如何用?它的常见应用场景有哪些呢?

本文介绍了到init()函数在 Go 中的特殊之处和使用方式。它提供了一种不同于其他语言的机制来初始化包,但也需谨慎使用以避免不必要的复杂性。最后,希望这篇文章能帮助你更好地理解和使用 Go 的init()函数。Go 中的 init 如何用?它的常见应用场景有哪些呢?

我是波罗学 1714

Go: init()执行顺序问题

init()函数会在包被初始化后自动执行,并且在main()函数之前执行,但是需要注意的是init()以及main()函数都是无法被显式调用的。 那么init()是不是最先执行的呢? 答案是否定的,首先,在他之前会进行全局变量的初始化。 当我们导入其他包时,会先初始化导入的包, 而初始化包时,会先加载全局变量,而后从上到下加载init()函数, 当被导入的包的init()函数执行完毕后,执行调用方的全局变量加载,init()函数的顺序加载,之后执行main()函数。 ...

五山口老法师 1376

init()函数何时运行?

I've tried to find a precise explanation of what the init() function does in Go. 我试图找到init()函数在Go中的

p15097962069的博客 3071

Golang入门笔记(8)—— init 函数

init 函数 : 每一个源文件都可以包含一个init函数,该函数会在 程序入口main函数执行前 ,被Go运行的框架进行调用。

wdw18668109050的博客 686

Go init函数一句话解释

Go init函数详解 其实记住一句话就行 初始化自动执行 初学的时候 还在找在哪调用的。。。。。但是一直找不到是谁调用的 *** init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来: 对变量进行初始化 检查/修复程序的状态 注册 运行一次计算 包的初始化 为了使用导入的包,首先必须将其初始化。初始化总是以单线程执行,并且按照包的依赖关系顺...

296

go init

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34319374的博客 77

Go之导入包、init函数、全局变量和main()函数的执行顺序

Go之导入包、init函数、全局变量和main()函数的执行顺序

li1136594919的博客 335

go学习-init和defer函数

3)多个defer,按先进后出顺序执行,谁离return近谁先执行。2)这些调用直到return前才被执行。因此可以用来做资源清理。4)defer语句变量中,在defer声明时就决定了。1、可以存在多个init函数并按顺序执行。1)关键字defer用于注册延迟调用。

weixin_39460121的博客 265
上一篇: Go语言中使用工作区模式解决私有包不方便调试的问题
下一篇: React16源码: React中创建更新的方式及ReactDOM.render的源码实现
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值