开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: init 函数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9605
init 函数
基本内容
一、 基本介绍
二、 案例说明
三、 init 函数的注意事项和细节
一、基本介绍
每一个源文件都可以包含一个 init 函数,该函数会在 main 函数执行前,被 Go 运行框架调用,也就是说 init 会在 main 函数前被调用。init 就是初始化的意思, init 函数经常被用来做初始化处理。
二、案例说明
package main
import(
"fmt"
)
// init 函数,通常可以在 init 函数中完成初始化工作
func init () {
fmt.Print1n( "init()...")
}
func main() {
fmt.Print1n( "main()...")
}
1、 输出的结果是:
D:\goproject\src\go_code\chapter06\funcinit>go main.go
init()…
main()…
2、代码解析:
写一个主函数 fmt.Println( "main()...")
, 再写一个 init 函数,当执行这段代码时,判断是 init 函数先执行还是主函数,最后先执行的 init 函数,从运行的结果看,init 函数是在 main 函数之前调用,通常可以在 init 函数中完成初始化工作。
三、init 函数的注意事项和细节
1.如果一个文件同时包含全局变量定义,init 函数和 main 函数,则执行的流程全局变量定义 ->init 函数 ->main 函数
package main
import (
"fmt"
)
var age = test()
//为了看到全局变量是先被初始化的,我们这里先写函数
func test() {
fmt.Println( "test()") //1
return 90
}
// init 函数,通常可以在 init 函数中完成初始化工作
func init(){
fmt.Println( "init()...") //2
}
func main() {
fmt.Println( "main()...age=", age)/ /3
}
(1) 代码解析:
写一个变量定义 var age=test() 为了看到全局变量是先被初始化的,先写一个函数来完成初始化,test() 先被输出,再是 init(),最后是 main() ,把 age 打印出来,输出 age 等于 90。输出结果 test 函数第一个执行,init 函数第二个执行,最后执行 main 函数,age=90。说明 go 程序的源文件中先执行变量定义,再执行 init,最后 main 函数。
D:\goproject\src\go_code\chapter06\funcinit>go run main.go
test()
init()…
main()…age = 90
2.init 函数最主要的作用,就是完成一些初始化工作,比如下面的案例
package main
import (
"fmt"
//引入包
"go_code/chaptere6/funcinit/utils"
)
var age = test()
//为了看到全局变量是先被初始化的,我们这里先写函数
func test() int {
fmt.Println( "test()")
//1
return 90
}
// init 函数,通常可以在 init 函数中完成初始化工作
func init() {
fmt.Println("init()...")
//2
}
func main() {
fmt.Println( "main()...age=", age)
//3
fmt.Println( "Age=", utils.Age,"Name=", utils.Name)
}
utils.go 的代码:
package utils
import”fmt”
var Age int
var Name string
// Age 和 Name 全局变量,我们需要在 main.go 使用
// 但是我们需要初始化 Age 和 Name
// init 函数完成初始化工作
func init() {
fmt.Println(“utils 包的 init()...”)
Age = 100
Name = "tom~"
}
(1) 运行结果为:
utils 包的 init()…
test()
init()…
main()…agr = 90
Age = 100 Name = tom~
(2) 结果分析:
main.go 中要用到另一个包的文件 utils.go,全局变量 Age 和 Name ,这两个变量需要在 main.go 中使用,但使用之前需要初始化,让 init 函数完成初始化工作,在 main.go 中使用需要先引入包 "go_code/chaptere6/funcinit/utils", 在引入的时候 utils.Age 和 utils.Name 在引入之前已经被初始化了。在执行代码的时候在引入包的过程或在调用包时已经被初始化了,结果可以看到最先执行的是 utils 包的 init() ,也就是说被引入的包里的 utils.go 最先执行。
3.面试题:案例如果 main.go 和 utils.go 都含有变量定义,init 函数时,执行的流程又是怎么样的。
解:如果 main.go 引入了 utils.go 文件,先执行被引入文件中的变量定义,然后执行被引入文件中的 init 函数。再执行 main.go 中的变量定义,再执行 untils.go中的 init 函数,依次是 main.go 中的变量定义 ->init 函数 ->main 函数。
如果 utils.go 也引入了别的文件,先执行别的文件中的变量定义 ->init 函数。