golang init方法和main方法初始化顺序
init()和main()方法是golang默认的两个方法,不需要我们调用,程序执行会自动寻找项目中的这俩方法。现在我们就讲一种通用的情况:
main 包下 导入了 init2 包而在init2 包下又导入了init3 包,三个包下都有自己的init 方法,初始化的顺序又是怎么的呢?
先看一段代码:
// demo_init1.go
package main
import "golang_thinking/src/article_init/init2"
import "fmt"
var VariableMain = "variable_main"
const ConstantMain = "constant_main"
func init() {
fmt.Printf("ConstantMain is %s \n",ConstantMain)
fmt.Printf("VariableMain is %s \n", VariableMain)
}
func main() {
fmt.Print("execute main method... \n")
init2.Init2()
}
程序不会先初始化demo_init1.go 里的,常量,变量,init() ,而是先会初始化init2包
demo_init2.go 代码如下:
// demo_init2.go
package init2
import "fmt"
import "golang_thinking/src/article_init/init3"
var VariableInit2 = "init2_variable"
const ConstantInit2 = "init2_constant"
func init() {
fmt.Printf("ConstantInit2 is %s \n",ConstantInit2)
fmt.Printf("VariableInit2 is %s \n",VariableInit2)
}
func Init2() {
fmt.Print("Init2 method... \n")
init3.Init3()
}
同时又引入了init3包,包内文件demo_init3.go 代码如下:
// demo_init3.go
package init3
import "fmt"
var VariableInit3 = "variable_init3"
const ConstantInit3 = "constant_init3"
func init() {
fmt.Printf("VariableInit3 is %s \n",VariableInit3)
fmt.Printf("ConstantInit3 is %s \n",ConstantInit3)
}
func init() {
fmt.Printf("一个包中最好只出现一个init方法\n")
}
func Init3() {
fmt.Print("Init3 method...\n")
}
最后贴出控制台的打印:

分析:先分析输出的中文:“一个包中最好只出现一个init方法”,这是demo_init3.go 的第二个init()方法里输出的内容,要说明的是,同一个包下可以有多个init方法,按init出现的顺序初始化,但是建议还是一个init为好;
从打印的顺序可以看出,是先初始化init3包下的init(),然后是init2包下init()方法,最后是main包下的init()方法。
最后初始化顺序总结下:开始是先在main包下,如果引入了其他包,就跳到其他包下初始化常量,变量,init()方法,如果又引入了其他包就又优先再其他包下按这个顺序初始化,以此类推。还要说明的是,如果导入的两个包中又都引入的第三个包,第三个包不会初始化两次,只会一次。
代码地址:https://github.com/wjsoho/golang_thinking/tree/master/src/article_init
golang init方法和main方法初始化顺序的更多相关文章
- ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器
我们一般知道Servlet接口中的init()方法在tomcat启动时调用,destroy()方法在tomcat关闭时调用.那么这两个方法到底在实际开发中有什么作用呢?这就是这个随笔主要讲的内容. 思 ...
- 关于Cocos2d-x中init方法和onEnter方法的区别
init()和onEnter()这两个方法都是写实例化对象的类(比如继承自Node的一些类等等)的时候用到的方法. 一般都是public类型下面的 bool init(); void onEnter( ...
- spring bean的init 方法和 destory方法的三种实现方式
1.通过@Bean(initMethod ="initPerson",destroyMethod ="destroyPerson" ) public class ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- OC类的本质,深入探讨,load方法和initialize方法
1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员 ...
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
- 详解 equals() 方法和 hashCode() 方法
创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...
- wait方法和sleep方法的区别
一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行. ...
- java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
随机推荐
- js最简单焦点图片轮播代码
将下面代码保存为banner.js,在需要显示焦点图的地方调用该js即可. <script type="text/javascript" src="banner.j ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]
[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...
- inode,软硬链接
如何查看inode ll -di /boot / /app查看文件和文件夹的inode号 df -i查看挂载点文件夹的inode号 做inode增长实验 创建60万个文件的方法1(效率不高):for ...
- linux NFS配置案例
1.查看NFS软件包 [root@server7 ~]# rpm -qa | egrep "nfs|rpcbind" 2.安装NFS和RPC服务 [ro ...
- Unity3D资源
1.ShareSDK 地址:https://github.com/MobClub/New-Unity-For-ShareSDK 文档:产品集成步骤 2.Protobuf https://github. ...
- C#定时任务之FluentScheduler
一.业务需求 平台首页,有几个指标统计,产品不要求实时性,觉得一天更新一次可以接受. 最后决定用FluentScheduler定时执行统计,redis缓存结果. 每天晚上1点进行定时任务统计,将统计结 ...
- CSS 的伪元素是什么?
CSS伪元素是用来添加一些选择器的特殊效果.用于:向某个选择器中的文字的首行. ㈠语法 ①伪元素的语法: selector:pseudo-element {property:value;} ②CSS类 ...
- CentOS 7 各个版本的区别
CentOS 7 各个版本的区别 2017年07月04日 10:44:37 程诺 阅读数 52029 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...
- 1209F - Koala and Notebook
这场比赛没打,看同学fst了,于是来看看. 这道题看似简单,但是没想清楚细节真的不太行.像现在熬到十一点左右,脑子真的不行. 首先显然位数越小越好,因为每一位要比较,不如拆点.此时要拆成两条有向链(开 ...
- LU分解法求逆矩阵 C语言实现
最近在网上找了下,没有找到我想要的C语言版本,找到的也是错误的.故自己写了一个,并进行了相关测试,贴出来分享. 具体的LU分解算法就不细说了,随便找本书就知道了,关键是分解的处理流程,细节特别容易出错 ...