Golang 初始化流程

作者: 与蟒唯舞 | 来源:发表于2018-10-24 17:48 被阅读28次

    规则:

    • package 只会被初始化一次
    • 同一个 package,不同文件是按照文件名的顺序来初始化
    • 不能循环 import , 例如:A import B ,然后又 B import A
    • 任何 package , 都可以存在一个以上的 init() , 执行顺序由上而下
    • main() 只能存在于 package main
    • 属于 package main 的文件 , 都将会初始化
    案例1

    sandbox.go

    package main
    
    import "fmt"
    
    var _ int64 = s()
    
    func init() {
        fmt.Println("init in sandbox.go")
    }
    func s() int64 {
        fmt.Println("calling s() in sandbox.go")
        return 1
    }
    func main() {
        fmt.Println("main")
    }
    

    a.go

    package main
    
    import "fmt"
    
    var _ int64 = a()
    
    func init() {
        fmt.Println("init in a.go")
    }
    func a() int64 {
        fmt.Println("calling a() in a.go")
        return 2
    }
    

    z.go

    package main
    
    import "fmt"
    
    var _ int64 = z()
    
    func init() {
        fmt.Println("init in z.go")
    }
    func z() int64 {
        fmt.Println("calling z() in z.go")
        return 3
    }
    

    执行命令:
    $ go run *.go

    输出结果:

    calling a() in a.go
    calling s() in sandbox.go
    calling z() in z.go
    init in a.go
    init in sandbox.go
    init in z.go
    main
    
    案例2

    sandbox.go

    package main
    
    import "fmt"
    
    func init() {
        fmt.Println("init 1")
    }
    func init() {
        fmt.Println("init 2")
    }
    func main() {
        fmt.Println("main")
    }
    

    utils.go

    package main
    
    import "fmt"
    
    func init() {
        fmt.Println("init 3")
    }
    

    执行命令:
    $ go run *.go

    输出结果:

    init 1
    init 2
    init 3
    main
    

    相关文章

      网友评论

        本文标题:Golang 初始化流程

        本文链接:https://www.haomeiwen.com/subject/dcuxtqtx.html