init 函数 : 每一个源文件都可以包含一个init函数,该函数会在 程序入口main函数执行前 ,被Go运行的框架进行调用。
测试代码:
package main
import (
"fmt"
)
func init() {
fmt.Println("init...")
}
func main() {
fmt.Println("main...")
}
console 输出:
init...
main...
很明显,此源文件的init函数是比main函数,优先执行的。所以init函数适合处理一些初始化的工作,然后再调用主函数。
细节讨论:
1. 如果一个文件中同时包含全局变量的定义,init函数 和 main 函数,则执行的流程是
变量的定义 => init函数 => main主函数 (可知变量的定义,比2个函数运行-跑的要早一些)
package main
import (
"fmt"
)
// 为了看到全局变量是先被初始化的,我们这里先一个函数来完成。
var age int = globalVariablesInit()
func globalVariablesInit() int {
fmt.Println("globalVariablesInit ... ")
return 90
}
func init() {
fmt.Println("init...")
}
func main() {
fmt.Println("main...")
}
在做项目的时候,这个知识点有巨大的作用。比如,现在有2个类。
如下函数读取时,就可以拿到在init中赋予的Name和Age 的值了。
package main
import (
"fmt"
"go-helloworld/class02/util" //导入util包 ,以使用的外部函数或变量
)
func main() {
fmt.Println(util.Name)
fmt.Println(util.Age)
}
- 面试题:案例中,如果main.go 和 util.go 都含有变量定义,init 函数,执行的顺序。
答: 先执行外部引入文件的 再 执行内部使用处代码,即:
util.go 变量定义 => util.go init 函数)
=> main.go 变量定义 => main.go 的init函数 => main.go的main函数