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

最新文章

  1. C++双缓冲多线程分析大文件词频
  2. 使用Netty绑定一个端口如何分辨出多种类型的DTU的注册包
  3. MyEclipse项目中的java文件的图标变成空心的问题
  4. Lucene
  5. (jdbc)取得数据库自动生成的主键方法
  6. 安卓开发之json解析
  7. Python beautifulsoup模块
  8. Javascript oop深入学习笔记(三)--javascript中类的实现
  9. 一站式远程页面调试工具spy-debugger 2.0,已支持HTTPS
  10. 游戏UI框架设计(五): 配置管理与应用
  11. myeclipse中git的使用
  12. 十款 Chrome 扩展工具,提高前端编码效率
  13. tensorflow学习001——MNIST
  14. idea2018版tomcat基本配置
  15. commons-lang3工具类学习(三)
  16. es的返回数据结构
  17. Java并发编程笔记之ConcurrentLinkedQueue源码探究
  18. golang 通过fsnotify监控文件,并通过文件变化重启程序
  19. python 元组(tuple)
  20. 2333: [SCOI2011]棘手的操作[我不玩了]

热门文章

  1. zencart模板列表下载地址
  2. django 自带认证系统(login,logout,authenticate,login_required)
  3. jquery前端问题随记
  4. 2018年最佳JavaScript数据可视化和图表库
  5. apache2 aliyun https证书配置
  6. 拒绝被坑!如何用Python和数据分析鉴别刷单!?
  7. alembic在tornado项目中的应用
  8. sizeof运算符、虚函数、虚继承考点(待修改)
  9. 对JavaScript 引擎基础:Shapes 和 Inline Caches
  10. b2b推广方式有哪些-