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")
}

最后贴出控制台的打印:

 
10.jpg

分析:先分析输出的中文:“一个包中最好只出现一个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方法初始化顺序的更多相关文章

  1. ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器

    我们一般知道Servlet接口中的init()方法在tomcat启动时调用,destroy()方法在tomcat关闭时调用.那么这两个方法到底在实际开发中有什么作用呢?这就是这个随笔主要讲的内容. 思 ...

  2. 关于Cocos2d-x中init方法和onEnter方法的区别

    init()和onEnter()这两个方法都是写实例化对象的类(比如继承自Node的一些类等等)的时候用到的方法. 一般都是public类型下面的 bool init(); void onEnter( ...

  3. spring bean的init 方法和 destory方法的三种实现方式

    1.通过@Bean(initMethod ="initPerson",destroyMethod ="destroyPerson" ) public class ...

  4. Hibernate中evict方法和clear方法说明

    Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...

  5. OC类的本质,深入探讨,load方法和initialize方法

    1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员 ...

  6. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  7. 详解 equals() 方法和 hashCode() 方法

    创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...

  8. wait方法和sleep方法的区别

    一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行.      ...

  9. 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 ...

随机推荐

  1. 【转载】关于java 的InputStream和OutputStream的理解

    关于InputStream和OutputStream的输入输出方向的理解 InputStream输入类,首先需要读取的内容转化成输入流,再从它那里进行读取,先关联源:之后过程中关联目的,这样形成了流: ...

  2. 用Python实现九九乘法表打印

    #!usr/bin/env python # -*- coding:utf-8 -*- # dic={ # 'apple':10, # 'iphon':5000, # 'wwatch Tv':3000 ...

  3. 原生js实现Ajax请求,包含get和post

    现在web从服务器请求数据,很多用到Ajax,不过都是用的JQuery封装好的,之前做项目,由于无法引用JQuery,所以就只能用原生了,话不多说,请看代码. /*------------------ ...

  4. dlopen用法

    1. 包含头文件  #include<dlfcn.h> 2. 函数定义 void * dlopen(const char* pathName, int mode); pathName 指的 ...

  5. Hangfire:任务定时调度

    hangfire 资源: GitHub:https://github.com/HangfireIO/Hangfire http://hangfire.io/ http://docs.hangfire. ...

  6. uniapp动态改变底部tabBar和导航标题navigationBarTitleText

    在开发中,我们会遇到需求国际化,那么底部tabBar和导航标题navigationBarTitleText就要动态切换: 1.改变底部tabBar: uni.setTabBarItem({ index ...

  7. CSS3做出条纹大背景

    ㈠实现不等宽背景条纹   实现如上图所示的效果,代码如下: <!DOCTYPE html> <html lang="en"> <head> &l ...

  8. PHP大文件上传断点续传源码

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  9. poj 3623(贪心)

    Best Cow Line, Gold Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6038   Accepted: 20 ...

  10. MYSQL中NULL陷阱

    1.NULL值不能做比较,跟任何值比较,NULL值都不会被筛选出来 2.NULL值做数学运算后依旧为NULL,比如 SELECT 5 + NULL 结果为NULL,但是SELECT 5+ '' 结果为 ...