zoukankan      html  css  js  c++  java
  • 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 
    ",ConstantMain)
        fmt.Printf("VariableMain is %s 
    ", VariableMain)
    }
    
    func main() {
        fmt.Print("execute main method...   
    ")
        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 
    ",ConstantInit2)
        fmt.Printf("VariableInit2 is %s 
    ",VariableInit2)
    }
    
    func Init2()  {
        fmt.Print("Init2 method... 
    ")
        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 
    ",VariableInit3)
        fmt.Printf("ConstantInit3 is %s 
    ",ConstantInit3)
    }
    
    func init() {
        fmt.Printf("一个包中最好只出现一个init方法
    ")
    }
    
    func Init3()  {
        fmt.Print("Init3 method...
    ")
    }
    

    最后贴出控制台的打印:

     
    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

  • 相关阅读:
    C#的扩展方法解析
    C#的Process类调用第三方插件实现PDF文件转SWF文件
    DotNet程序配置文件
    C#中的委托解析
    DotNet生成随机数的一些方法
    好久没玩laravel了,今天玩下Laravel项目迁移步骤
    关于WIN7下IE8IE7浏览器无法安装微信支付商户证书的解决方案
    dedecms5.7文章页替换掉特定标志的图片链接
    原生PHP和MYSQL练习登陆验证和查询数据到表格
    我眼中的如何成为一名合格的PHP高级开发工程师
  • 原文地址:https://www.cnblogs.com/ExMan/p/11452721.html
Copyright © 2011-2022 走看看