golang初始化顺序

【go从入门到精通】go包,内置类型和初始化顺序 go内置类型,包,包的初始化顺序精讲 阅读详情

在GO程序中,初始化的几个结构通常为:包(package),常量(const),变量(var),init()和main()。 
接下来我说一下这几个结构的执行顺序:

当 A 没有引入其他包的情况下执行顺序是:package > const > var > init() > main()
当 A 里引入了包 B 的时候会有一些变化,程序会先执行包 B 里面的import,const,var,init()函数,执行完毕之后跳回 A ,继续按照顺序执行。
如果包B里面引入了C包,如上规则执行

--------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------

 

Go 语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如:

  • 整型和浮点型变量的默认值为 0。
  • 字符串变量的默认值为空字符串。
  • 布尔型变量默认为 bool。
  • 切片、函数、指针变量的默认为 nil。
  • ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

.import机制

● main -> import pkg1 -> const -> var ... -> init() -> main()

● pkg1 -> import pkg2 -> const -> ...

● pkg2 -> ...

import(

    "time"                       //普通写法

    . "fmt"                       //使用此包内的成员时不带fmt前缀

    j "encoding/json"    //json包重命名

                                     // 引入包顺序遵循 标准库,项目包,第三方包

)

        不要使用相对路径引入包(以GOPATH/src作为根目录)

        import 后面跟着包路径。go语言的惯例只是一个特例,即恰好目录名与包名一致。import中的foo只是一个文件系统的路径。而下面foo.Foo()中的foo则是包名。而这个包是在src/foo目录下的源码中找到的。

 

2. init函数

        init函数可以在任何包中有0个或1个或多个; init函数和main函数都不能被显示调用;

        但这无论是对于可读性还是以后的可维护性来说,强烈建议用户在一个package中每个文件只写一个init函数。

 

3. 变量初始化顺序

        全局变量初始化若有需要依赖其它变量,则被依赖的变量先初始化。但局部变量这样的话就会报错

    var a int = b + 1

    var b int = 1

 

        下面例子会报 "initialization loop" 错误

   var a = b

   var b = c

   var c = a

没有依赖关系的初始化的顺序不一定。

 

当程序里面只有一个goroutine时候,虽然编译器和CPU由于开启了优化功能可能调整读写操作的顺序,但是这个调整是不会影响程序的执行正确性:

a := 1//1
b := 2//2
c := a + b //3
...

如上代码由于编译器和cpu的优化,实际运行时候可能代码(2)先运行,然后代码(1)后执行,但是由于代码(3)依赖代码(1)和代码(2)创建的变量,所以代码(1)和(2)不会被放到代码(3)后运行,也就是说编译器和CPU在不改变程序正确性的前提下才会对指令进行重排序,所以上面代码在单一goroutine时候并不会存在问题,也就是在单一goroutine 中Happens Before所要表达的顺序就是程序执行的顺序。

 

4. 类型检查

        Go编译器可以从初始化表达式的右值推导出该变量应该声明为哪种类型,这让Go语言看起来有点像动态类型语言,但是Go语言实际上是强类型语言(静态类型语言

大疆 2021 嵌入式笔试题 在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。 阅读详情

相关推荐

Android逆向实战:通过smali/baksmali动态注入DEX逻辑

本文详细介绍了在无源码条件下对Android应用进行动态逻辑注入的实战方法。通过使用smali和baksmali工具对DEX文件进行反编译、修改与重打包,实现在目标方法中插入自定义代码(如日志打印),并分享了定位目标、处理寄存器、避免常见错误的实用技巧与避坑指南。

weixin_29008691的博客 365

golang程序初始化顺序

1.导入顺序及初始化顺序 下图展示了程序启动后导入包的顺序及初始化的顺序。 导入顺序:导入包从main包开始,依次导入被引用的pkg1、pkg2、pkg3包。 初始化顺序:与导入顺序相反,最后被导入的最先被初始化。pkg3、pkg2、pkg1、main 每个包初始化顺序:每个文件初始化顺序都是常量、变量、init函数。如果包里有多个文件,按照文件名“从小到大”排序顺序执行。 注意事项: 一个包被其它多个包 import,但只能被初始化一次 避免出现循环 import,例如:A –> B –&g

Haikuotiankong11111的博客 626

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 341

Golang 常量的声明和初始化

常量的声明定义和变量非常相似,无非是将关键字 var 替换成 const。 但需要注意一点,就是常量必须要初始化的,也就是必须要有值,不能像变量那样,先定义后赋值。而且常量听名字就知道是一旦赋值后就是不可变的。 常量声明和初始化 常量声明,指定常量数据类型并且初始化: const name string = "Golang" 常量声明,根据常量的值自动推导出数据类型: const name = "Golang" 多常量声明,指定常量类型并且初始化: const name, num int = 1, 2

极客点儿 1460

达梦DCA2023年10月培训及考试总结

本次培训共分三天,培训内容不单单是DCA的单机安装、实例创建、库表操作等,培训内容是把关系型数据库的理论及DM8的产品结合起来讲,很实用。具体的考试则是需要个人大量的线下练习,考试总体而言都是培训讲过的内容,只要用心听,好好练习,哪怕是没有计算机基础的童鞋也能考过。提示:以下是本篇文章正文内容,下面案例可供参考总体而言,本次考试不是很难,用心准备,考前认真听讲,考后多次练习,基本都能通过。

qinjuao的博客 2321

别再为环保数采仪通讯发愁!手把手教你用MCGS触摸屏+4G模块发送HJ212报文

本文详细介绍了如何使用MCGS触摸屏配合4G模块高效发送HJ212标准报文,解决工业环保监测中的数据采集与传输难题。从硬件连接到软件配置,再到报文组装与发送策略,提供全流程实用指南,特别针对4G网络环境下的特殊设置给出优化建议,帮助工程师提升数据传输稳定性与效率。

weixin_30847865的博客 389

golang 中 init func 和 var 谁先执行问题

golang 中有的 init 函数会先 main 函数执行,var 会先 init 函数执行。 /** * @Author: v_bivwei * @Description: * @Date: 2020/7/4 16:44 */ package main import "fmt" func init() { fmt.Println("init func") } func main() { fmt.Println("main func") } /** * @Author: v_bi

卩杉的博客笔记 1734

别再手动敲代码了!用STM32CubeMX+FreeRTOS图形化配置,5分钟搞定多任务通信框架

本文详细介绍了如何利用STM32CubeMX和FreeRTOS快速搭建多任务通信框架,大幅提升嵌入式开发效率。通过图形化配置工具,开发者可在5分钟内完成任务调度、时钟配置和内核对象生成,特别适合物联网设备开发。文章还提供了代码优化和调试技巧,帮助开发者轻松应对复杂应用场景。

weixin_30363285的博客 292

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

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

Doublelv 的博客专栏。 7171

081、LLC谐振变换器的短路特性与保护

本文深入分析了LLC谐振变换器在短路工况下的特性与保护策略。作者通过实际案例指出,LLC在输出短路时会出现谐振电流失控、ZVS条件丧失等危险现象,导致MOS管炸毁。文章详细阐述了短路保护的三大难点:响应速度、频率与电流的耦合、重启策略,并提出了硬件级快速保护、频率快速拉升、打嗝模式等实用解决方案。作者分享了关键参数设计经验,包括电流检测阈值设置、最高频率限制和保护响应时间控制,并通过实测波形验证了保护效果。最后总结出五点重要经验,强调硬件保护的必要性和系统设计的注意事项,为LLC变换器的短路保护设计提供了有

Jack010169的博客 76

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 248

GO语言初始化顺序

在GO程序中,初始化的几个结构通常为:包(package),常量(const),变量(var),init()和main()。 接下来我说一下这几个结构的执行顺序: 当 A 没有引入其他包的情况下执行顺序是:package > const > var > init() > main() 当 A 里引入了包 B 的时候会有一些变化,程序会先执行包 B 里面的import,...

Eighteen Z 1346

高通MBIM拨号流程简述

高通平台MBIM流程简述

不秃头的程序猿Gabriel的博客 5071

go语言包、变量、init初始化顺序

一个完整的 go 语言可运行程序,通常会包含引用的包、变量、init 函数以及 main 函数几个部分。 包、变量、常量、init 函数以及 main 函数初始化顺序如下图所示: 在一个 go 语言程序中,初始化顺序规则如下: 引入的包 当前包中的变量、常量 当前包的 init 函数 main 函数 初始化顺序说明: 在 go 源程序中,每一个被 import 的包,按照在源文件中出现顺序初始化。 如果当前包有多个 init 函数在不同的源文件中,则按照源文件名以字典序从小到大排序,小的先被执行到。

编程宝库 1654

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Go学习日记1-Go初始化顺序

go1

qq_15965621的博客 838

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Go语言中的包初始化顺序是怎样的?

Go语言中的包初始化顺序是一个复杂的概念,它受到多个因素的影响,包括包的依赖关系、包的导入顺序以及初始化语句的位置等。了解这些因素有助于我们更好地设计和组织Go程序,避免可能出现的初始化顺序问题。推荐阅读我的博客首页Golang专栏。

发现生活,分享智慧,一起成长! 1151

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Go 语言包初始化顺序详解

Go语言程序初始化顺序遵循严格规则:1. 递归初始化所有依赖包;2. 单个包内先初始化变量再执行init函数;3. 多文件包中,先处理所有文件的包级变量(文件顺序不确定),再按文件名顺序执行init函数。示例显示,当导入dao和root包时,会先初始化依赖包的变量和init函数,再执行主包的变量初始化和init函数,最后执行main函数。特别注意的是,多文件包的初始化顺序中,变量初始化优先于init函数,且init函数按文件名字母顺序执行。

longchanghua_enshi的专栏 277

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

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

1万+

golang init方法和main方法初始化顺序

golang init方法和main方法初始化顺序 init()和main()方法是golang默认的两个方法,不需要我们调用,程序执行会自动寻找项目中的这俩方法。现在我们就讲一种通用的情况: main 包下 导入了 init2 包而在init2 包下又导入了init3 包,三个包下都有自己的init 方法,初始化的顺序又是怎么的呢? 先看一段代码: // demo_init1.go packag...

RenXiang_Code的博客 4447

golang的初始化顺序

Init 每个包都可以定义一个或多个init函数2(原型为 func init()),init函数在包初次 被导入时调用,同一个包内的多个init函数的执行的顺序是不定的,而如果这个包又导入了其他的包,则级连调用,所有包import完成,所有init函数执行完后,则开始main的执行。 而对于全局变量,以一个简单的例子来说明:  // package p  var gInt int…  // p

vipally的专栏 1261

go编程:浅析go程序初始化顺序

在一个 go 程序中通常包含:包、常量、变量、init()、main()等元素,如果同时存在多个包,包之间存在依赖关系,每个包中存在多个 init 函数,每个文件中存在多个 init 函数,那么问题来了,他们之间的执行顺序是什么样的?通过本文我们来对它们之间的执行顺序做尽可能详尽的说明。如有不正之处,欢迎批评指正。 包的执行顺序 在 main 包中的 go 文件默认总是会被执行 同包下的...

天将降大任于是人 1万+

go init函数_Go学习总结之程序初始化顺序

在一个Go程序中通常包含:包(package),常量(const),变量(var),init(),main()等元素,如果同时存在多个包,包之间存在依赖关系,那么各个元素的初始化顺序是如何呢?初始化顺序假设场景下pck1包含pkg2,pkg2包含pkg3,初始化顺序该是如何呢?如果pkg1没有引入其他包的情况下,初始化顺序是package->const->var->init()-...

weixin_39520013的博客 196

go语言编译的初始化顺序

函数运行之前,Go会依次初始化每个被导入的包中的全局变量。按照包的导入顺序依次执行,自动调用,不能显示调用。每个包的全局变量在程序运行时都会被自动初始化。函数执行完毕后,程序会进入。函数,开始执行主程序。都会在全局变量之后和。

weixin_73075352的博客 451

Golang中init()函数初始化顺序

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB。

Faya__的博客 566

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

说一说 go程序初始化顺序跟websocket

说一说 go程序初始化顺序跟websocket

m0_56869626的博客 774
上一篇: 深度探索c++对象模型
下一篇: go内存模型
runner668
博客等级 码龄11年 161粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值