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

RenXiangCode · · 4717 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:RenXiangCode

查看原文:golang init方法和main方法初始化顺序

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4717 次点击  
加入收藏 微博
1 回复  |  直到 2018-10-31 10:12:18
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传