Go语言之包初始化

在之前的例子中提到过初始化的顺序问题和init函数:

学习RadonDB源码(一)

观察一下下面的两段代码:

a.go:

package main

import "fmt"

var _ = a()

func a() int {
    fmt.Println("this is a file!")
    return 1
}

func init() {
    fmt.Println("init a file!")
}

runner.go:

package main

import "fmt"

var _ = r()

func r() int {
    fmt.Println("this is main!")
    return 1
}

func init() {
    fmt.Println("init main file")
}

func main() {
    fmt.Println("this is main function!")
}

这两个文件在同一个包下面,根据之前说的原则,首先应该初始化的是包级别的变量,也就是说,执行后会首先打印:

//这里顺序是以我的输入顺序为准的
this is a file!
this is main!

然后就会进入init函数,因此之后的打印应该是:

//打印顺序同上
init a file!
init main file

最后才会进入main函数,打印this is main function!

我的命令一定是这样的

go run a.go runner.go

如果我调换两个go文件的顺序,那么打印的顺序也就会发生相应的变化了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章